4

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

有小费吗?

我已经尝试过使用 ginput。

[X, Y]= ginput(2)

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

在这段代码中,我定义了正方形的角(用户使用 ginput 定义了两个点)。但是当我检查图像的点时,它们是错误的。我认为是因为图形的大小在情节上不一样。

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

4

2 回答 2

2

这里真的有两个问题:

1) 你的 GINPUT 代码有什么问题和 2) 如何编写 roiCircle 或 roiSquare

在回答(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),以便它们像 roiPoly 一样很好地更新,这些将需要大量(尽管并非不可克服)的 MATLAB GUI 编程。这很容易处理,但不是微不足道的。

于 2012-12-12T14:29:39.803 回答
1

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

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

    [X1, Y1] = ginput(1);
    xp = [X1 Y1];
    
  2. 为圆生成一个句柄:

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

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

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

    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对调用函数可见,因此您可以使用它。

于 2014-05-14T05:18:13.867 回答