Matlab GUI:使用imfreehand()时遇到的问题

时间:2016-01-10 16:45:56

标签: matlab matlab-figure

我在am图像上应用了Canny边缘检测,现在想要裁剪其中的一部分以进行进一步处理。我用标签axis1,axes2,axes3和axes4创建了4个轴。我想先在axes1中显示图像,然后在axes1中再次检测到边缘。最后,在轴4中移除孔后,裁剪后的图像将显示在轴3和图像中。

我提供了一个重新创建问题的示例代码:

function varargout = samp_GUI(varargin)

 % Begin initialization code - DO NOT EDIT
 gui_Singleton = 1;
 gui_State = struct('gui_Name', mfilename, 'gui_Singleton',         gui_Singleton, 'gui_OpeningFcn', @samp_GUI_OpeningFcn, 'gui_OutputFcn',  @samp_GUI_OutputFcn, 'gui_LayoutFcn',  [] , 'gui_Callback',   []);
 if nargin && ischar(varargin{1})
  gui_State.gui_Callback = str2func(varargin{1});
 end

 if nargout
  [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
 else
  gui_mainfcn(gui_State, varargin{:});
 end
 % End initialization code - DO NOT EDIT


% --- Executes just before samp_GUI is made visible.
function samp_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
 handles.output = hObject;
 guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = samp_GUI_OutputFcn(hObject, eventdata, handles) 
 varargout{1} = handles.output;

% --- Executes on button press in browse.
function browse_Callback(hObject, eventdata, handles)
 [filename pathname] = uigetfile({'*.jpg';'*.bmp'},'File Selector');
 handles.myImage = strcat(pathname, filename);
 axes(handles.axes1);
 imshow(handles.myImage)
 im=imread(handles.myImage);

 bw3=im2bw(im,0.3); %threshold value taken as 0.3
 BW3=edge(bw3,'canny');
 edge_im = BW3;
 axes(handles.axes1);
 imshow(BW3);

 h=imfreehand(handles.axes1);
 M=~h.createMask();
 I(M) = 0;

 axes(handles.axes2);
 imshow(I);title('Cropped Image')
 I = bwareaopen(I, 50);
 axes(handles.axes3);
 imshow(I),title('Removed Holes');
 % save the updated handles object
 guidata(hObject,handles);

当我在.m文件中执行代码时,它可以在不同的窗口中打开不同的图像,但是当为GUI运行相同的代码时,空白图像就会出现问题。我似乎不明白问题在哪里。

1 个答案:

答案 0 :(得分:0)

我认为您正遭受某种形式的复制/粘贴问题。如果你看一下代码中的I(M) = 0这行并不合适(给出你的例子),因为我没有定义。

MATLAB此时不会抛出任何错误,因为以这种方式创建矩阵是完全有效的;但是,这样做实际上会产生行向量而不是您想要的图像。

>> M = logical(eye(100));
>> size(M)

ans =

   100   100

>> clear I
>> I(M) = 0;
>> size(I)

ans =

           1       10000

我想你想要做的是将遮罩应用到你的图像(im),在这种情况下你应该得到你想要的东西。我在下面提供了一个示例(不确定您是否尝试在axes1中显示)。

load mri
img = double(D(:,:,12));
im = img ./ max(img(:));

figure

handles.axes1 = subplot(2,2,1);
handles.axes2 = subplot(2,2,2);
handles.axes3 = subplot(2,2,3);
handles.axes4 = subplot(2,2,4);

bw3=im2bw(im,0.3); %threshold value taken as 0.3
BW3=edge(bw3,'canny');
edge_im = BW3;
axes(handles.axes1);
imshow(BW3);

h=imfreehand(handles.axes1);
M=~h.createMask();

% Assign im to I to ensure proper cropping.
I = im;
I(M) = 0;

axes(handles.axes3);
imshow(I);title('Cropped Image')
M_noholes = bwareaopen(M, 50);
I(M_noholes) = 0;
axes(handles.axes4);
imshow(I),title('Removed Holes');

如果您提供更多信息,将更容易帮助您弄清楚您需要什么。