在matlab中选择一个ROI(圆形和方形),以便应用过滤器

在matlab中选择一个ROI(圆形和方形),以便应用过滤器,matlab,geometry,interactive,roi,Matlab,Geometry,Interactive,Roi,我正在使用matlab,我想做一个交互式选择,就像你使用函数roipoly时做的那样,但我想选择一个圆或一个正方形。我已经在搜索函数来选择感兴趣的区域(ROI),就像你使用roipoly但使用圆形或正方形时选择的那样,但我找不到任何东西 有什么建议吗 我已经试过使用轧棉机了 [X, Y]= ginput(2) xmin=min(X) xmax=max(X) ymin=min(Y) ymax=max(Y) 在这段代码中,我定义了正方形的角(用户用ginput定义了两点)。但是当我检查图像的点时

我正在使用matlab,我想做一个交互式选择,就像你使用函数roipoly时做的那样,但我想选择一个圆或一个正方形。我已经在搜索函数来选择感兴趣的区域(ROI),就像你使用roipoly但使用圆形或正方形时选择的那样,但我找不到任何东西

有什么建议吗

我已经试过使用轧棉机了

[X, Y]= ginput(2)

xmin=min(X)
xmax=max(X)
ymin=min(Y)
ymax=max(Y)
在这段代码中,我定义了正方形的角(用户用ginput定义了两点)。但是当我检查图像的点时,它们是错误的。我认为这是因为图的大小与图上的不一样


选择我想要的ROI的最佳方法是使用与roipoly类似的函数,但对于圆形和方形,而不是多边形。使用这种类型的功能,我只能用“ginput”选择图片内部的点。如果用户选择图形外部的任何点,我必须键入一条错误消息(问题是它们不匹配,我可以选择的点大于图像的大小)。

这里确实有两个问题:

1) 你的GINPUT代码有什么问题 和 2) 如何书写圆形或方形

回答第(1)条,没有什么不对;该代码的行为应该是:

imgData = randn(100);
imagesc(imgData );
[X, Y]= ginput(2)

xmin=min(X);
xmax=max(X);
ymin=min(Y);
ymax=max(Y);

squareX = [xmin xmin xmax xmax xmin];
squareY = [ymin ymax ymax ymin ymin];
hold on; 
plot(squareX,squareY); %plot the correct square
hold off;
您可以使用IMCROP获取数据:

width = xmax - xmin;
height = ymax - ymin;
imgSelect = imcrop(imgData,[xmin,ymin,width,height]);
figure; imagesc(imgSelect);

至于(2)(编写roiCircle或roiSquare),要使它们像Roiply一样进行良好的更新,这些都需要大量的MatlabGUI编程(尽管不是不可克服的)。它很容易处理,但并不琐碎。

我使用以下技术实现了交互式区域选择(在我的例子中是圆形):

  • 使用内置ginput(1)获取第一个点:

  • 生成圆的控制柄:

    h = plot(X1, Y1, 'r');
    
  • 设置自定义MouseMove事件处理程序以选择第二个点:

    set(gcf, 'WindowButtonMotionFcn', {@mousemove, h, xp});
    
  • 等待用户单击,同时处理程序发挥其魔力:

    k = waitforbuttonpress;
    
  • 最后禁用处理程序:

    set(gcf, 'WindowButtonMotionFcn', '');
    
  • 事件处理程序如下所示:

    function mousemove(object, eventdata, h, xp)
    cp = get(gca, 'CurrentPoint');
    r = norm([cp(1,1) - bp(1) cp(1,2) - bp(2)]);
    theta = 0:.1:2*pi;
    xc = r*cos(theta)+bp(1);
    yc = r*sin(theta)+bp(2);
    set(h, 'XData', xc);
    set(h, 'YData', yc);
    end
    

    瞧。这很好地工作,调用函数可以看到
    r
    ,因此您可以使用它。

    我想在图像中选择一个正方形或一个圆形,然后在其上应用过滤器,然后用我在其上应用过滤器时选择的圆形或方形显示图像。用ROIPLY很容易做到,但做正方形或圆形我不知道怎么做。我认为我不能用ginput函数来实现。
    function mousemove(object, eventdata, h, xp)
    cp = get(gca, 'CurrentPoint');
    r = norm([cp(1,1) - bp(1) cp(1,2) - bp(2)]);
    theta = 0:.1:2*pi;
    xc = r*cos(theta)+bp(1);
    yc = r*sin(theta)+bp(2);
    set(h, 'XData', xc);
    set(h, 'YData', yc);
    end