在图像上绘制可调整大小的框

时间:2014-09-04 00:23:28

标签: matlab image-processing matlab-guide roi

我正在研究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副本?请帮忙.. 感谢。

2 个答案:

答案 0 :(得分:0)

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

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

那应该这样做。由于您首先绘制了particleroiSize(也是hggroup类型),因此您可能不希望删除对findobj调用的所有输出。如果当前轴中有多个矩形,则hfindROI将包含多个条目。因此,您可能希望删除所有这些,但第一个对应于particleroiSize

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

答案 1 :(得分:0)

感谢。除了我必须使用

之外,这完美地运作
hfindROI = findobj(handles.Image_Sequence_Plot,'Type','hggroup');
delete(hfindROI(1:end-1))

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