一、简介
数学形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有2个基本的运算,即腐蚀和膨胀,而腐蚀和膨胀通过结合又形成了开运算和闭运算。 开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。
1 二值形态学 粗略的说,腐蚀可以使目标区域范围“变小”,其实质造成图像的边界收缩,可以用来消除小且无意义的目标物。式子表达为: 该式子表示用结构B腐蚀A,需要注意的是B中需要定义一个原点,【而B的移动的过程与卷积核移动的过程一致,同卷积核与图像有重叠之后再计算一样】当B的原点平移到图像A的像元(x,y)时,如果B在(x,y)处,完全被包含在图像A重叠的区域,(也就是B中为1的元素位置上对应的A图像值全部也为1)则将输出图像对应的像元(x,y)赋值为1,否则赋值为0。 我们看一个演示图。 B依顺序在A上移动(和卷积核在图像上移动一样,然后在B的覆盖域上进行形态学运算),当其覆盖A的区域为[1,1;1,1]或者[1,0;1,1]时,(也就是B中‘1’是覆盖区域的子集)对应输出图像的位置才会为1。
2 膨胀 粗略地说,膨胀会使目标区域范围“变大”,将于目标区域接触的背景点合并到该目标物中,使目标边界向外部扩张。作用就是可以用来填补目标区域中某些空洞以及消除包含在目标区域中的小颗粒噪声。 该式子表示用结构B膨胀A,将结构元素B的原点平移到图像像元(x,y)位置。如果B在图像像元(x,y)处与A的交集不为空(也就是B中为1的元素位置上对应A的图像值至少有一个为1),则输出图像对应的像元(x,y)赋值为1,否则赋值为0。 演示图为: 3 小结 也就是说无论腐蚀还是膨胀,都是把结构元素B像卷积操作那样,在图像上平移,结构元素B中的原点就相当于卷积核的核中心,结果也是存储在核中心对应位置的元素上。只不过腐蚀是B被完全包含在其所覆盖的区域,膨胀时B与其所覆盖的区域有交集即可。
4 灰度形态学 在讲述灰度值形态学之前,我们进行一个约定,即将结构元素B覆盖住的图像A的区域记为P(取Part之意)。
5 灰度形态学的腐蚀 那么灰度形态学中的腐蚀就是类似卷积的一种操作,用P减去结构元素B形成的小矩形,取其中最小值赋到对应原点的位置即可。 我们来看一个实例,进行加深对灰度形态学的理解。 假设我们有如下的图像A和结构元素B: 进行灰度形态学腐蚀的过程如下: 我们对输出图像的第一个元素的输出结果进行具体的展示,也就是原点对应的4的位置。输出图像其他的元素的值也都是这样得到的。我们会看到,B首先覆盖的区域就是被减数矩阵,然后在其差矩阵中求min(最小值)来作为原点对应位置的值。 灰度形态学的膨胀 根据上面对腐蚀的描述,我们对膨胀做出同样的描述,灰度形态学中的膨胀就是类似卷积的一种操作,用P加上B,然后取这个区域中的最大值赋值给结构元素B的原点所对应的位置。 这里也对输出图像第一个元素值的来历做个说明。 对上面矩阵的和求最大值就是6,所以把6赋值给结构元素原点所对应的位置。
6 小结 上面介绍了灰度形态学的概念,这里来说一说各自的用处。相比较于原图像,因为腐蚀的结果要使得各像元比之前变得更小,所以适用于去除高峰噪声。而灰度值膨胀的结果会使得各像元比之前的变得更大,所以适用于去除低谷噪声。
二、源代码
function varargout = untitled(varargin)
% UNTITLED M-file for untitled.fig
% UNTITLED, by itself, creates a new UNTITLED or raises the existing
% singleton*.
%
% H = UNTITLED returns the handle to a new UNTITLED or the handle to
% the existing singleton*.
%
% UNTITLED('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in UNTITLED.M with the given input arguments.
%
% UNTITLED('Property','Value',...) creates a new UNTITLED or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before untitled_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to untitled_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help untitled
% Last Modified by GUIDE v2.5 21-May-2021 23:07:23
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @untitled_OpeningFcn, ...
'gui_OutputFcn', @untitled_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 untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to untitled (see VARARGIN)
% Choose default command line output for untitled
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes untitled wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im;
global str;
[filename,pathname]=uigetfile_new({'*.*'},'选择训练图片...');
str=[pathname filename];
im=imread(str);
axes(handles.axes1);
imshow(im);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im1;
global str1;
[filename,pathname]=uigetfile_new({'*.*'},'选择测试图片...');
str1=[pathname filename];
im1=imread(str1);
axes(handles.axes2);
imshow(im1);
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im;
global im1;
global str1;
se1 = strel('disk',5);
se2 = strel('square',16);
thresh1 = 0.2;
thresh2 = 0.01;
imtra = im2double(im);
rt = imtra(:,:,1);
gt = imtra(:,:,2);
bt = imtra(:,:,3);
idxr1 = find(rt>0);
idxg1 = find(gt>0);
idxb1 = find(bt>0);
mr1 = mean(rt(idxr1));
mg1 = mean(gt(idxg1));
mb1 = mean(bt(idxb1));
clear idxr1 idxg1 idxb1 idxgr1;
im1=imread(str1);
I1 = im2double(im1);
col = size(I1,2);
rate = 1600/col;
I1 = imresize(I1,rate);
r1 = I1(:,:,1);
g1 = I1(:,:,2);
b1 = I1(:,:,3);
[row1,col1] = size(r1);
r1 = abs(r1 - mr1);
g1 = abs(g1 - mg1);
b1 = abs(b1 - mb1);
x1 = (r1+g1+b1)./3;
figure(1);
imshow(x1,[]);
title('减去颜色分量');
x1 = im2bw(x1,10/255);
figure(12);
imshow(x1,[]);
title('二值化图像');
x1 = imopen(x1,se1);
x1 = imclose(x1,se2);
figure(2);
imshow(x1,[]);
title('开闭运算后');
y1 = adjvar(g1);
y1 = im2bw(y1,50/255);
figure(3);
imshow(y1,[]);
title('计算像素方差并二值化');
x1 = -x1+1;
x1_labeled = bwlabel(x1);
%显示连通区域
%得到连通区域数量
x1_num = max(max(x1_labeled));
%显示原图像,以便后面在循环中作标记
figure(4);
imshow(I1);
title('识别结果');
for i = 1:x1_num
x1_idx = find(x1_labeled==i);
y1_idx = find(y1(x1_idx)==1);
%如果当前连通区域中对应的方差二值图像中前景像素数占连通区域总像素数比例大于
%某一阈值,则认为是马唐草,在原图像上作标记,此处没有准确计算应标记的位置。
if(size(y1_idx,1)/size(x1_idx,1)>thresh1)
idx = x1_idx(floor(1+size(x1_idx,1)/2));
r = mod(idx,row1);
c = ceil(idx/row1);
text(c,r,'马唐草','color','black');
end
end
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
clear all
clc
close(gcf)
三、运行结果
四、备注
版本:2014a