一、简介
数学形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有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 小结\ 上面介绍了灰度形态学的概念,这里来说一说各自的用处。相比较于原图像,因为腐蚀的结果要使得各像元比之前变得更小,所以适用于去除高峰噪声。而灰度值膨胀的结果会使得各像元比之前的变得更大,所以适用于去除低谷噪声。
二、源代码
``` % ********************** % 说明:设计思路:先对原图像进行灰度化即二值化处理,再进行区域分割和特征提取。 % 颜色特征利用已知水果图片计算平均色度,再进行判别; % 形状特征是对分割出的区域进行分析,不同水果具有特定的形状信息,本设计主要选择面积和长轴长度以及离心率作为判别特征。 % 平均色度的计算可参见sedu.m,形状特征的计算可参见Region_separate.m % ********************* function varargout = Fruits_recognition(varargin) % FRUITS_RECOGNITION MATLAB code for Fruits_recognition.fig % FRUITS_RECOGNITION, by itself, creates a new FRUITS_RECOGNITION or raises the existing % singleton. % % H = FRUITSRECOGNITION returns the handle to a new FRUITSRECOGNITION or the handle to % the existing singleton. % % FRUITS_RECOGNITION('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in FRUITS_RECOGNITION.M with the given input arguments. % % FRUITS_RECOGNITION('Property','Value',...) creates a new FRUITS_RECOGNITION or raises the % existing singleton. Starting from the left, property value pairs are % applied to the GUI before FruitsrecognitionOpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to FruitsrecognitionOpeningFcn 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 Fruits_recognition
% Last Modified by GUIDE v2.5 04-May-2021 19:46:07
% Begin initialization code - DO NOT EDIT guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @FruitsrecognitionOpeningFcn, ... 'guiOutputFcn', @FruitsrecognitionOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin && ischar(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end
if nargout [varargout{1:nargout}] = guimainfcn(guiState, varargin{:}); else guimainfcn(guiState, varargin{:}); end % End initialization code - DO NOT EDIT
% --- Executes just before Fruitsrecognition is made visible. function FruitsrecognitionOpeningFcn(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 Fruitsrecognition (see VARARGIN)
% Choose default command line output for Fruits_recognition handles.output = hObject;
% Update handles structure guidata(hObject, handles); global fruitname %初始化 fruitname='Banana'; % UIWAIT makes Fruits_recognition wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. function varargout = FruitsrecognitionOutputFcn(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;
% ********************* % *** ****** % *** Useful Functions Starts here ****** % *** ****** % *********************
% --- Executes on button press in Fileopen. function FileopenCallback(hObject, eventdata, handles) % hObject handle to Fileopen (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global img; global imgray; global imbw; global HSV; global fruitname; [filename,pathname]=uigetfile('*.jpg'); %读取图像 img = imread([pathname,filename]); imgray = rgb2gray(img); %灰度化 imbw = im2bw(imgray,0.9); %二值化 imbw= bwareaopen(imbw, 10); %去除图像中面积过小的杂点 imbw= 1 - imbw; %灰度反转,将背景变为黑色
HSV = rgb2hsv(img); %转换为HSV,为后面的颜色元素的提取做准备 axes(handles.axes1); colormap(colorcube); imagesc(img); set(handles.axes1,'xtick',[],'ytick',[]); % --- Executes when selected object is changed in uipanel2. function uipanel2SelectionChangeFcn(hObject, eventdata, handles) % hObject handle to the selected object in uipanel2 % eventdata structure with the following fields (see UIBUTTONGROUP) % EventName: string 'SelectionChanged' (read only) % OldValue: handle of the previously selected object or empty if none was selected % NewValue: handle of the currently selected object % handles structure with handles and user data (see GUIDATA) global fruitname switch get(hObject, 'Tag') case 'radiobuttonbanana' fruitname = 'Banana'; case 'radiobuttonpepper' fruitname = 'Pepper'; case 'radiobuttonpear' fruitname = 'Pear'; case 'radiobuttontomato' fruitname = 'Tomato'; case 'radiobuttonapple' fruitname = 'Apple'; end
% --- Executes on button press in Recognition. function RecognitionCallback(hObject, eventdata, handles) % hObject handle to Recognition (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global img; %global imgray; global imbw; global fruitname; global imshow; global HSV; [Label,num] = bwlabel(imbw,8); %将不同的图形进行分别标记,num表示连接的图形对象的个数 pro = regionprops(Label,'all'); % 统计被标记的区域的形状特征
% %% 计算已知类别水果的平均色度 % I=imread('梨.jpg'); % meanhupear=Chromacitycaculate(I) % I1=imread('青椒.jpg'); % meanhupepper=Chromacitycaculate(I1) % I2=imread('香蕉.jpg'); % meanhubanana=Chromacitycaculate(I2) % I3=imread('西红柿.jpg'); % meanhutomato=Chromacitycaculate(I3)
% %% 计算各个分块图像的色度 FilledLabel = imfill(Label,'holes'); %填充打过标记的边界线中间围成的图形区域 [row,col] = size(FilledLabel); %统计填充后的图形中各块图形所含像素的个数的多少 MeanHue = zeros(1,num); for i = 1 : num Hue = zeros(pro(i).Area,1); nPoint = 0; for j = 1 : row for k = 1 : col if(FilledLabel(j,k) == i) nPoint = nPoint + 1; Hue(nPoint,1) = HSV(j,k,1); 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);
end
MeanHue(i) = MeanHue(i) / (0.8*nPoint); %计算出平均的色度值
end
```
三、运行结果
\ \ \
四、备注
版本:2014a