2016-01-10 2 views
0

Я применил обнаружение края канны на изображении и теперь хочу обрезать его часть для дальнейшей обработки. Я создал 4 оси с метками axes1, axes2, axes3 и axes4. Я хочу сначала отобразить изображение в осях 1, затем ребро, обнаруженное снова в осях1. Наконец, обрезанное изображение должно отображаться в осях 3 и изображение после удаления отверстий в осях4.Matlab GUI: проблемы при использовании imfreehand()

Я в том числе образец кода, который воссоздает проблему:

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, он работает отлично с различными изображениями открываются в разных окнах, но когда тот же код запуска для графического интерфейса, пустые изображения - проблемы. Я не понимаю, где проблема.

+0

Вместо этого я рекомендую использовать 'subplot', проще. – flawr

+0

Вопросы по StackOverflow обычно должны содержать [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). Код, который вы опубликовали, не является полным и не поддается проверке. Пожалуйста, [edit] (http://stackoverflow.com/posts/34708069/edit) ваш вопрос, чтобы убедиться, что код в вашем вопросе ** Минимальный ** (только код, необходимый для воспроизведения), ** Завершить ** (весь код, необходимый для воспроизведения) и ** Подтверждаемый ** (мы должны иметь возможность воспроизвести проблему, используя только код в вашем вопросе, не меньше и ничего больше). – excaza

+0

Я попробовал 'subplot' тоже, но та же ошибка сохранилась. Кажется, что 'imfreehand()' не принимает никакого ввода, несмотря на то, что я отмечаю ROI на изображении. –

ответ

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), в этом случае вы должны получить то, что вы хотите. Я привел пример ниже (не уверен, что вы пытаетесь показать в осях1).

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'); 

Если вы предоставляете больше информации, вам будет проще помочь вам разобраться в том, что вам нужно.

+0

Большое спасибо, присваивая 'im'' I' сделал трюк !! –

Смежные вопросы