2014-09-08 5 views
1

3 (x, y) 좌표로 정의 된 삼각형 집합이 있습니다. x 축은 0에서 2까지이고 y 축은 같은 크기 (단위는 인치)입니다.삼각형 집합에서 비트 맵 만들기 : Matlab

각 삼각형에는 RGB 값이 지정됩니다.

각 삼각형을 서로 겹쳐서 렌더링하고 (순서는 중요하지 않음) 400 x 400 픽셀 크기의 비트 맵 이미지를 하나 만들고 싶습니다 (내 x와 y는 2 인치 길이이고 인치당 200 픽셀) .

내 방법은 아래에 나와 있지만, 내 솔루션 방법으로 독자의 의견을 색칠하지 않기를 바랍니다. 중요한 것은 문제입니다.

내 방법 : matlab의 fill() 함수를 사용하여 각 삼각형에서 패치 객체를 만들어 플롯했습니다. 그런 다음 getframe()을 사용하여 matlab 그림에서 비트 맵을 만듭니다. 문제는 내 그림 주위에 흰색 여백이 생기고 크기는 420 x 560 픽셀입니다. 내 코드는 다음과 같습니다.

fill() 및 getframe() 만 사용하여이 문제를 해결할 수있는 경우 실수를 지적하십시오. getframe()을 사용하지 않고 문제를 해결할 수있는 방법이 있기를 바라고 있습니다. 감사.

P. 내 앞의 질문 당신은 getframe 기능 당신이 원하는 자르기 사각형을 나타내는 제 2 인수를 줄 수 getframe() Create a bitmap from patch object in Matlab

N = 5; 
Tri = 100; 
res = 200; %200 pixles per inch 
G = zeros(Tri,9,N); 


X = 2*rand(Tri,3,N); 
Y = 2*rand(Tri,3,N); 
R = randi([0 255],Tri,N)/255; 
G = randi([0 255],Tri,N)/255; 
B = randi([0 255],Tri,N)/255; 

for c1=1:N 
    G(:,1:3,c1)= X(:,:,c1); 
    G(:,4:6,c1)= Y(:,:,c1); 
    G(:,7,c1)= R(:,c1); 
    G(:,8,c1)= G(:,c1); 
    G(:,9,c1)= B(:,c1); 

end 

for c2=1:N; 
    h = figure('Visible','off'); 
    for c3 =1:Tri 
     h1 = fill(G(c3,1:3,c2), G(c3,4:6,c2), [G(c3,7,c2) G(c3,8,c2) G(c3,9,c2)]); 
     set(h1,'EdgeColor','None'); 
     hold on; 
    end 

    set(gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 400 400]/res, 'visible','off'); 
    set(gca,'visible','off'); 
    F = getframe(h); 
    [a, b] = frame2im(F); 

end 

답변

0

회색 채우기없이 그림을 전체 창에 채우도록 이미지를 만들 때 for 루프를 수정해야합니다. 또한 축을 끌 수도 있습니다. 또한 각 이미지를 생성 할 때 틱을 해제해야합니다. 이것은 틱 레이블을 쓰지 않고 틱 길이를 0으로 설정하는 조합으로 수행됩니다. 즉, 코드가 다음과 같이 수정되어야합니다.

for c2=1:N; 
    h = figure('Visible','off'); 
    subplot('position', [0 0 1 1]); %// NEW 
    axis off; %// NEW 
    set(h, 'PaperUnits', 'inches', 'PaperPosition', [0 0 400 400]/res); 
    for c3 =1:Tri 
     h1 = fill(G(c3,1:3,c2), G(c3,4:6,c2), [G(c3,7,c2) G(c3,8,c2) G(c3,9,c2)]); 
     set(h1,'EdgeColor','None'); 
     set(gca,'xcolor','w','ycolor','w','xtick',[],'ytick',[]) %// NEW 
     set(gca,'Ticklength',[0 0]); %// NEW 
     hold on; 
    end 
    %print(h,'-dbmp',['-r' num2str(res)],['file' num2str(c2)]); 

    F = getframe(h); 
    close all; %// NEW 
    [a, b] = frame2im(F); 
    a = imresize(a, [400 400], 'nearest'); %// NEW 
end 

이 여전히 당신이 만드는 각 이미지에 대한 팝업되는 프레임을 표시합니다,하지만 당신은 할 수 있어야한다 : 나는 당신의 코드에서 %// NEW 문을 확인하여 코드를 삽입 어디 있는지 볼 수 있습니다 이 시점에서 순전히 순수한 이미지 데이터를 얻을 수 있습니다. 이미지는 여전히 400 x 400보다 조금 더 크게 나오고 있습니다. 이는 테두리와 눈금 등을 제거한 후에는 숫자가 모두 인 그림이 늘어납니다. 이 문제를 해결하기 위해 imresize을 사용하고 이미지를 원하는 크기만큼 400 x 400까지 축소합니다. 또한 새 이미지를 생성 할 때마다 새 그림이 생성된다는 점에 유의하십시오. getframe을 호출 할 때마다 임의로 생성 된 다각형 이미지가있는 그림이 팝업되고 getframe이 현재 프레임의 스냅 샷을 찍습니다. 당신이 그 그림의 스냅 샷을 찍을 수 없기 때문에 이런 일이 일어나지 않도록하는 방법은 없습니다. 이 문제를 해결할 수있는 한 가지 방법은 이미지를 가져온 후에 그림을 닫는 것입니다. getframe을 호출 할 때마다 close all;을 수행 할 수 있습니다. 그렇게하면 한 번에 하나의 그림 만 표시되지만 여전히 그림이 표시되는 것을 방해하지는 않습니다.

이 해결책을 찾으면 알려 드리겠습니다.

0

에 대해이었다. 당신의 인물의 관심 영역 경계를 찾아 내십시오.

자세한 내용은 help getframe을 참조하십시오.

+0

내가 생각하는 한 가지 옵션입니다.하지만 나는 그 함수를 전혀 사용할 필요가 없으며 대신 그림을 그려 내지 않고 삼각형을 비트 맵으로 렌더링 할 것이라고 생각했습니다. 나는 내 대답으로 의견을 색칠하고 싶지 않다. 감사. – user3761729

관련 문제