我在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运行相同的代码时,空白图像就会出现问题。我似乎不明白问题在哪里。
答案 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');
如果您提供更多信息,将更容易帮助您弄清楚您需要什么。