2012-09-13 4 views
6

GUI가 두 개 있습니다. 첫 번째 축에는 저해상도 이미지가 있습니다.Matlab : IMRECT로 선택된 ROI의 실시간 플로팅

IMRECT를 사용하여 첫 번째 축의 영역을 선택한 다음이 영역을 두 번째 축의 고해상도 이미지로 표시하면서 IMRECT 사각형을 계속 이동하면서 계속 업데이트하고 싶습니다.

내가 할 수있는 유일한 방법은 "for 루프"를 사용하여 0.1 초의 일시 중지가있는 상태에서 1-2 분 동안 실행하고 IMRECT로 ROI를 변경하는 동안 매우 복잡합니다.

제 생각에는 마우스가 첫 번째 축에서 움직일 때마다 실행되는 함수를 사용하는 것이고, 그 함수에서 플로팅 및 getPosition 명령을 사용하는 것이 좋습니다. 그러나, 나는 그러한 함수를 작성하는 방법에 대해서는 잘 모르겠다.

도움이 될 것입니다.

+1

하는 체크 아웃 : http://stackoverflow.com/questions/10998739/scaleable-dragable-box-on-plots-that-select-select-data/10998803 # 10998803 –

답변

4

일반적으로 imrect에 콜백을 지정해야합니다. 예 :

x = imrect(); 
x.addNewPositionCallback(@(x)(disp('The rect has changed'))) 

익명 함수를 사용하여 이미지와 두 번째 축과 같은 추가 매개 변수를 콜백에 가져와야합니다.


내가 원하는 것을 수행하는 작은 코드 스 니펫을 작성했습니다. 귀찮게하지 않았으므로 경계 체크를 추가해야합니다. 사각형을 이동할 때 imshow을 실행하는 대신 CData을 업데이트하므로 매우 부드럽습니다. 세 차이 안드레이의 답변 @로

GUI

function Zoomer 
    figure(); 

    highResImage = imread('peppers.png'); 
    lowResImage = imresize(highResImage,0.5); 

    a1 = subplot(2,1,1); 
    a2 = subplot(2,1,2); 

    imshow(lowResImage,'Parent',a1); 
    initialPosition = [10 10 100 100]; 
    lowResRect = imrect(a1,initialPosition); 

    lowResRect.addNewPositionCallback(@(pos)Callback(pos,a2,highResImage)); 

    Callback(initialPosition , a2, highResImage); 
end 

function Callback(position,axesHandle, highResImage) 
    position = position * 2; 
    x1 = position(1); 
    y1 = position(2); 
    x2 = position(1) + position(3); 
    y2 = position(2) + position(4); 

    highResThumbnail = highResImage(round(y1:y2),round(x1:x2),:); 

    if isempty(get(axesHandle,'Children')) 
     imshow(highResThumbnail,'Parent',axesHandle); 
    else 
     imHandle = get(axesHandle,'Children'); 
     oldSize = size(get(imHandle,'CData')); 
     if ~isequal(oldSize, size(highResThumbnail)) 
      imshow(highResThumbnail,'Parent',axesHandle); 
     else 
      set(imHandle,'CData', highResThumbnail); 
     end  
    end 
end 
+0

감사합니다, 안드레이. 나는 완벽하게 작동하도록했습니다. 이전에 어려움을 겪고 있었고, 그것이 바로 제가 찾고 있던 것이 었습니다. 직사각형을 이미지 크기 내로 제한하기 위해 사용했던 이전 코드 행은 더 이상 작동하지 않습니다. 올바른 선택을 축 내에서 제한하는 빠른 해결책이 있습니까? 고마워요! – user1668909

+0

@ user1668909, http://stackoverflow.com/questions/10998739/scaleable-dragable-box-on-plots-that-can-select-data/10998803#10998803을 확인하십시오. 특히'makeConstraint' 함수 –

1

Simillar 기능 :

  • 대신 'CData'axis 제한 설정
  • 배율 (빠를 수있다?) 가변적이며 사각형 크기에 따라 다릅니다. 'fit'로 인해 10.
  • 추가 ConstraintFcn

은 다음과 같습니다 호출 할 수

function imZ = Zoom(im, s) 

f = figure; 
a1 = subplot(1,2,1); 
imshow(im,'InitialMagnification', 'fit'); 
a2 = subplot(1,2,2); 
imshow(im,'InitialMagnification', 'fit'); 

Ipos = [0 0 s]; 
rect = imrect(a1,Ipos); 
rect.setPositionConstraintFcn(@(p) Const(p,size(im))); 
rect.addNewPositionCallback(@(p) CB(p,a2)); 
CB(Ipos,a2); 

if nargout > 0 
    uiwait(f); 
    imZ = im(pm(2):pm(2)+pm(4),pm(1):pm(1)+pm(3),:); 
end 

    function p = Const(p,imS) 
     p(1:2) = max(1,p(1:2)); 
     p(1:2) = min(imS([2 1])-p(3:4),p(1:2)); 
    end 

    function CB(p,a) 
     pm = round(p); 
     axes(a);  
     axis([pm(1),pm(1)+pm(3),pm(2),pm(2)+pm(4)]); 
    end 
end 

가로 : 또한

Zoom(imread('peppers.png'),[100 100]); 
+0

이것이 가장 좋은 대답이라고 생각합니다. –

관련 문제