数学形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有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 = fruit(varargin) % FRUIT MATLAB code for fruit.fig % FRUIT, by itself, creates a new FRUIT or raises the existing % singleton*. % % H = FRUIT returns the handle to a new FRUIT or the handle to % the existing singleton*. % % FRUIT('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in FRUIT.M with the given input arguments. % % FRUIT('Property','Value',...) creates a new FRUIT or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before fruit_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to fruit_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 fruit % Last Modified by GUIDE % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @fruit_OpeningFcn, ... 'gui_OutputFcn', @fruit_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 fruit is made visible. function fruit_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 fruit (see VARARGIN) set(handles.axes1,'xtick',[]); set(handles.axes1,'ytick',[]); set(handles.axes1,'box','on'); set(handles.axes2,'xtick',[]); set(handles.axes2,'ytick',[]); set(handles.axes2,'box','on'); % Choose default command line output for fruit handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes fruit wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = fruit_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) str=uigetfile({'*.gif';'*.png';'*.bmp';'*.jpg'},'读取图像'); %str=handles.b; I = imread(str); axes(handles.axes1) %在axes1上作图 imshow(I); handles.a=I; guidata(hObject,handles) % --- 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) img=handles.a; R=img(:,:,1); %获取彩色图像的r值。 G=img(:,:,2); %获取彩色图像的g值。 B=img(:,:,3); %获取彩色图像的b值。 I2=rgb2gray(img); %将图像灰度化。 %figure,imshow(I2),title('灰度图像'); BW=im2bw(I2,0.9); %将图像二值化。 SE=strel('rectangle',[40 30]); % 结构定义 J2=imopen(BW,SE); axes(handles.axes2)% 进行开运算去除噪声和平滑边界 imshow(J2); handles.b=J2; guidata(hObject,handles) % --- 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) J2=handles.b; img=handles.a; SE=strel('square',3); % 定义3×3腐蚀结构元素 J=imerode(~J2,SE); %对图像进行腐蚀操作。 BW2=(~J2)-J; % 检测边缘 %填充了已有的检测的连续形状边界 B = imfill(BW2,'holes'); %对图像填充孔洞。 B = bwmorph(B,'remove'); %获得图像中区域边界。 %将不同的图形进行分别标记,num表示连接的图形对象的个数 [Label,num] = bwlabel(B); %进行标记。 for i = 1 : num Area(i) = 0; end Label = imfill(Label,'holes'); %填充打过标记的边界线中间围成的图形区域 %计算各个图像的hsv颜色(色度) HSV = rgb2hsv(img); %转换为HSV颜色模型。 [row,col] = size(Label); %统计填充后的图形中各块图形所含像素的个数的多少 MeanHue = zeros(1,num); %初始化 for i = 1 : num Hue = zeros(Area(i),1); %初始化 nPoint = 0; %初始化 for j = 1 : row for k = 1 : col if(Label(j,k) == i) nPoint = nPoint + 1; %对于是连通区域中的点npoint+1. Hue(nPoint,1) = HSV(j,k,1); %把hsv的值赋给Hue数组。 end end end Hue(:,i) = sort(Hue(:,1)); for j = floor(nPoint*0.1) : floor(nPoint*0.9) MeanHue(i) = MeanHue(i) + Hue(j,1); %将hsv(i)的值赋给MeanHue(i) end MeanHue(i) = MeanHue(i) / (0.8*nPoint); %计算出平均的色度值 end %调用regionprops函数获得各个联通区域的属性值(中心点坐标,外接椭圆的长短轴长度,面积)。 [L,num]=bwlabel(BW2); %重新进行区域标记。 stats= regionprops(L, 'ALL'); %调用regionprops函数。 for i= 1:num longth(i)=stats(i).MajorAxisLength; %获得外接椭圆的长轴长度 width(i)=stats(i).MinorAxisLength; %获得外接椭圆的短轴长度 end %初始化。 R2=0; G2=0; B2=0; x=0; y=0; %求出似圆性。 for i=1:num r(i)=0; g(i)=0; b(i)=0; yuan(i)=longth(i)/width(i);%长轴长度/短轴长度为似圆性特征。 end
版本:2014a
完整代码或代写加1564658423