【问题标题】:Drawing a resizeable box on an image在图像上绘制可调整大小的框
【发布时间】:2014-09-04 00:23:27
【问题描述】:

我正在开发 gui 并使用 GUIDE。它加载并成像,并让用户在一个点周围绘制一个 ROI(粒子 ROI)。然后我想要两个滑块来创建第二个 ROI(扫描 ROI),用户可以在其中使用滑块设置第二个 roi 的宽度和高度,并在图像上看到它的更新。滑块似乎工作正常,但我的 gui 不断在图像上绘制一个新的 roi,所以看起来很快就会变得凌乱。我想在重绘之前从图像中删除用户相当大的 roi(同时仍将原始粒子 ROI 保留在图像上。我目前采用以下方式:

在 setroi 大小按钮的回调中(这应该是用于粒子 ROI)

    handles=guidata(hObject);
particleroiSize=imrect;% - draw a rectagle around the particle to get a meausr eof ROI size
roiPoints=getPosition(particleroiSize); %-get tha parameters fo the rectanlge
partX1 = round(roiPoints(1));
partY1 = round(roiPoints(2));
partX2 = round(partX1 + roiPoints(3));
partY2 = round(partY1 + roiPoints(4)); % these are the ROi positions in pixels

roiHeight = round(roiPoints(3)); % - these are just the ROI width and height
roiWidth  = round(roiPoints(4));

handles=guidata(hObject); %_ update all the handles...
handles.partX1=partX1;
handles.partX2=partX2;
handles.partY1=partY1;
handles.partY2=partY2;

handles.roicenterX = (partX1 + round(roiPoints(3))/2);
handles.roicenterY= (partY1 + round(roiPoints(4))/2);

handles.roiHeight = roiHeight;
handles.roiWidth = roiWidth;
current_slice = round(get(handles.Image_Slider,'Value'));
particleImage=handles.Image_Sequence_Data(partY1:partY2,partX1:partX2,current_slice);
handles.particleImage=particleImage;

set(handles.RoiSizeDisplay,'String',strcat('Particle ROI is ',' ',num2str(roiHeight),' ', ' by ',num2str(roiWidth)) );

guidata(hObject,handles); 

然后在回调中设置我拥有的扫描 ROI 大小的滑块(这是在两个不同的滑块内,一个调整宽度,一个调整高度: 句柄=guidata(hObject);

try
  delete(handles.ScanArea);
  % plus any cleanup code you want
catch
end



WidthValue = get(handles.ScanAreaSliderWidth,'value');
HeightValue = get(handles.ScanAreaSliderHeight,'value');

set(handles.ScanAreaWidthDisplay,'String',strcat('Scan Area Width is ','  ', num2str(WidthValue))); % sets the display..now to do the drawing...


%h = imrect(hparent, position);
%position = [Xmin Ymin Width Heigth];
position = [ round(handles.roicenterX-WidthValue/2) round(handles.roicenterY-HeightValue/2) WidthValue HeightValue];

handles.ScanArea = imrect(handles.Image_Sequence_Plot,position);
%h = imrect(hparent, position)
handles=guidata(hObject);
guidata(hObject, handles);

但它永远不会删除扫描区域的 ROI 并不断对其进行重绘..我认为 try...catch 会起作用,但似乎没有。我是在制作额外的 ROI 副本还是什么?请帮忙.. 谢谢。

【问题讨论】:

    标签: matlab image-processing matlab-guide roi


    【解决方案1】:

    如果需要删除imrect绘制的ROI,可以使用findobj查找矩形对象(类型为“hggroup”)并删除:

    hfindROI = findobj(gca,'Type','hggroup');    
    delete(hfindROI)
    

    应该这样做。由于您第一次绘制 particleroiSize,它也是 hggroup 类型,因此您可能不想删除调用 findobj 的所有输出。如果当前轴上有多个矩形,则hfindROI 将包含多个条目。因此,您可能想要删除所有这些,但第一个对应于particleroiSize

    我希望你的问题是正确的。如果不是,请要求澄清!

    【讨论】:

      【解决方案2】:

      谢谢。这工作得很好,只是我必须使用

      hfindROI = findobj(handles.Image_Sequence_Plot,'Type','hggroup');
      delete(hfindROI(1:end-1))
      

      要摆脱除第一个 ROI 之外的所有内容,所以我猜 hggoup 对象是在开始时添加的? (我以为我会使用 deleted(hfindROI(2:end)) 删除除第一个以外的所有内容。另外,为什么 hfindROI 返回数字列表?它们代表 hggroup 对象或类似的东西吗? 谢谢..

      【讨论】:

      • 嗯,老实说,我猜到 (2:end) 是正确的。基本上,数字列表对应于轴(handles.Image_Sequence_Plot)中包含的给定类型(在您的情况下为 hggroup)的所有对象的句柄。我认为手柄将根据它们在轴中创建的顺序进行排序。
      • 这是有效的,但它似乎也移除了所有 ROI 的句柄。我确实想从图像中删除 ROI,但我想保留 ROI 信息的句柄..(即扫描区域的高度和宽度)有没有办法做到这一点?
      • 是的,您应该能够执行以下操作;设置(你的手柄,'可见','关闭');这将使它们不可见而不删除它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多