7

2 つの軸を持つ GUI があります。最初の軸には低解像度のイメージがあります。

私がやりたいのは、IMRECT を使用して最初の軸の領域を選択し、その領域を 2 番目の軸に高解像度の画像として表示し、IMRECT の四角形を移動すると継続的に更新することです。

私がこれを行うことができた唯一の方法は、IMRECT で ROI を選択して変更している間、1 ~ 2 分だけ実行される 0.1 の一時停止を含む「for ループ」を使用することです。これは非常に面倒です。

私が考えたのは、マウスが最初の軸内で移動するたびに実行される関数を使用し、その関数にプロット コマンドと getPosition コマンドを使用することでした。ただし、そのような関数を作成する方法がわかりません(軸内でのマウスの動きをトリガーします)。

どんな助けでも大歓迎です!

4

2 に答える 2

5

一般に、コールバックを に割り当てる必要がありますimrect。例えば:

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

コールバックは、匿名関数を利用して、画像や 2 番目の軸などの追加パラメーターを取得する必要があります。


あなたが望むことをする小さなコードスニペットを書きました。私は気にしなかったので、境界チェックを追加する必要があります。CData四角形を移動すると実行されるのではなく更新さimshowれるため、非常にスムーズです。

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
于 2012-09-13T14:40:52.253 に答える
2

@Andrey の返信と同様の機能ですが、3 つの違いがあります。

  • axis代わりに制限を設定します'CData'(どちらが速いでしょうか?)
  • 倍率は可変であり、 により、長方形のサイズに依存します'fit' 'IniitalMagnification'
  • 追加された 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]);
于 2014-04-22T13:57:45.933 に答える