文档库 最新最全的文档下载
当前位置:文档库 › DIP实验报告-形态学图像处理

DIP实验报告-形态学图像处理

DIP实验报告-形态学图像处理
DIP实验报告-形态学图像处理

课程:数字图像处理

课程作业实验报告

实验名称:Morphological and Other Set Operations

实验编号:

签名:

姓名:

学号:

截止提交日期:年月日

摘要:本实验学习一些基本的形态学图像处理知识。掌握数学形态学集合的基本运算;编程实现二值图像的膨胀和腐蚀处理,掌握一些基本的形态学算法,如:边界提取;针对灰度图像编程实现膨胀和腐蚀处理,编写函数实现灰度图像形态学梯度处理和顶帽变换,最后对形态学梯度变换结果和顶帽变换结果进行比较。

一、技术论述

1、图像的逻辑运算及数学形态学

很多应用是以形态学概念为基础的,并涉及二值图像。数学形态学的语言是集合论。同样,形态学为大量的图像处理问题提供了一种一致的有力方法。数学形态学中的集合表示图像中的不同对象。例如,在二值图像中,所有黑色像素的集合是图像完整的形态学描述。在二值图像中,正被讨论的集合是二维整数空间 (P)的元素,在这个二维整数空间中,集合的每个元素都是一个多元组(二维向量),这些多元组的坐标是一个黑色(或白色,取决于事先的约定)像素在图像中的坐标(x,y)。灰度级数字图像可以表示为Z空间(Z3)上分量的集合。在这种情况下,集合中每个元素的两个分量是像素的坐标,第3个分量对应于像素的离散灰度级值。更高维度空间中的集合可以包含图像的其他属性,比如颜色和随时间变化的分量。

集合运算尽管本质上很简单,但对于实现以形态学为基础的图像处理算法是一种有力的补充手段。本实验中,我们关注的是涉及二值图像和灰度图像的逻辑运算。

在图像处理中用到的主要集合运算是:并、交、补、差、位移和镜像。图1中总结了这些运算的性质。

图1 主要的集合运算

在两幅或多幅图像的对应像素间逐像素进行逻辑运算。因为只有在两个变量都是1时,两个二进制变量的“与”运算才为1,所以只有两幅输人图像的对应像素均为1时,“与”运算的结果才是1。图2显示了涉及图像逻辑运算的不同例子。这里,黑色表示1,而白色表示0(这里使用两种约定的说法,有时会颠倒黑色和白色二值的意义,取决于在给定情况下哪种表达更清楚。使用图1中的定义构造其他的逻辑运算很容易。例如,异或运算是当两个像素的值不同时结果为1,否则为0。这种运算与“或”运算不同。“或”运算在两个像索有一个为1或两个均为1时结果为1。

数学形态学方法对图像进行分析的基本思想是:用具有一定形态的结构元素去度量和提取图像中的对应形状,达到对图像分析和识别的目的。将数学形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,等等。数学形态学是对于探索和研究二值图像和灰度图像具有很大益处.

图2 图像逻辑运算

2、二值图像的腐蚀与膨胀及形态学算法之一:边界提取

1、二值图像腐蚀:对Z中的集合A和B,使用B对A进行腐蚀定义为:

(式9.2-1)

这个公式说明,使用B对A进行腐蚀是所有B中包含于A中的点z的集合用z平移。

2、二值图像膨胀:设A和B是(Z2)中的集合,A被B膨胀定义为:

(式9.2-3)

这个公式是以得到B的相对于它自身原点的映像并且由z对映像进行位移为基础的。A被占膨胀是所有位移z的集合,这样,B和 A至少有一个元素是重叠的。与在其他形态学运算中一样,集合B通常叫做膨胀的结构函数。

二值图像的腐蚀与膨胀示例图如图(3)所示:

图3 二值图像的腐蚀与膨胀示例图

3、集合A的边界表示为,它可以通过先由B对A腐蚀,而后用A减去腐蚀得到。即:

(式9.5-1)

这里B是一个适当的结构元素。图3说明了边界提取的机理。这幅图像显示了一个简单的二值对象、一个结构元素B和使用式9.5-1的结果。

尽管图3中显示的结构元素是最常用的结构元素之一,但它绝对不是惟一的。例如,使用由1组成的5×5大小的结构元素将得到2到3个像素宽的边界。

图4 边界提取

3、灰度图像的膨胀与腐蚀及形态学的应用

1、用结构元B对灰度图像进行膨胀表示为:

这里和

分别是f和b的定义域。f和b是函数而不是二值

形态学情况中的集合。必须在f的定义域内以及x 和y 必须在b的定义域内的条件与膨胀的二值定义中的条件是相似的(这里两个集合的交集至少应有一个元素)。该公式的形式与二维卷积是相似的,并且用最大值运算代替卷积求和,用加法运算代替卷积乘积。

2、用结构元B对灰度图像进行腐蚀表示为:

这里和

分别是f和b的定义域。平移参数

必须在f的定义域内,而且x和y必须在b的定义域内,这与腐蚀的二值定义中的条件相似。同样,公式在形式上与二维相关是相似的,并且用最小值运算代替了相关运算,用减法运算代替了相关的乘积。

灰度形态学的膨胀与腐蚀的一维示意图如下:

图5 膨胀与腐蚀一维示意图

3、形态学梯度:膨胀和腐蚀经常用于计算图像的形态学梯度,其公式为:

(式9.6-11)

膨胀粗化一副图像中的区域,二腐蚀则细化它们。膨胀和腐蚀的差强调了区域间的边界。同质区域不受影响,因此减操作趋于消除同质区域。最终结果是边缘被增强而同质区域的贡献被抑制,从而产生类似于微分的效果。

4、形态学Top-hat变换,定义为:

(式9.6-12)

f是输入图像,b是结构元函数,该应用对于增强灰度图像的阴影细节很有用处。

二、实验结果及讨论

实验结果如图(6)~图(7)所示:

1、对于处理二值图像Fig9.20(left),本实验使用全1矩阵作为结构元素。实验结果如图6所示:从左做到右,从上到下依次为:Fig9.20(left)原图像、对图像进行腐蚀、膨胀和边缘特征提取处理结果。从实验结果可见,经过腐蚀处理后,白色英文字母变得细化了,而经过膨胀处理后字母显得更宽了。右下角是边界提取结果,从结果可见边界比较明显。

2、对于处理灰度图像Fig9.39(a),本次实验使用M矩阵作为结构元素。实现灰度图像的膨胀、腐蚀并进行形态学梯度处理和Top-hat变换。

图7从左做到右,从上到下依次为:灰度图像的膨胀、腐蚀、形态学梯度处理和Top-hat 变换结果。可以看到,膨胀处理后灰度图像的亮特征变浓了,暗特征降低了。腐蚀处理后灰度图像的暗特征变浓了,亮特征降低了,与膨胀效果相反。

从图7的左下图可以看到经过形态学梯度公式处理后的图像边缘被增强而同质区域的贡献被抑制,产生了类似于微分的效果。

从图7的右下图可以看到经过Top-hat变换后的图像的阴影细节得到增强。

Fig9.20(left)原图腐蚀处理图

膨胀处理图边界提取结果图

图6 二值图像的膨胀、腐蚀和边缘特征提取

灰度图的膨胀结果灰度图的腐蚀结果

形态学梯度输出结果T ophat变换输出结果

图5 灰度图像的膨胀、腐蚀、形态学梯度及Top-hat结果

三、程序附录

clc;clear all;close all;

%%

%%第一部分:二值图像的膨胀腐蚀及边界提取%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 主函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

A=imread('Fig9.20(left).jpg'); %输入图像I

A=mat2gray(A);

B=[1 1 1;1 1 1;1 1 1]; %3*3的结构元

erode_img = My_DilateErode(A,B,'im_erode');

subplot(1,2,1);

imshow(A);

title('Fig9.20(left)原图');

subplot(1,2,2);

imshow(erode_img);

title('腐蚀处理图');

figure

dilate_img = My_DilateErode(A,B,'im_dilate');

subplot(1,2,1);

imshow(dilate_img);

title('膨胀处理图');

K = A - erode_img; % 边界提取:原图减去腐蚀结果

subplot(1,2,2);

imshow(K);

title('边界提取结果图');

%%第二部分:灰度图像的膨胀腐蚀及Top-hat处理%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

M=[0 1 0;1 1 1;0 1 0]; %3*3的结构元

ima=imread('Fig9.39(a).jpg');

dilate_img = My_GrayDilateErode(ima,M,'im_dilate'); figure

imshow(uint8(dilate_img));

title('灰度图的膨胀结果');

Figure

erode_img = My_GrayDilateErode(ima,M,'im_erode'); imshow(uint8(erode_img));

title('灰度图的腐蚀结果');

Figure

grad_img = dilate_img - erode_img; % 公式9.6-11

grad_img = uint8(grad_img);

imshow(grad_img);

title('形态学梯度输出结果');

% Tophat处理:先进行开操作,然后原图减去开操作结果

m1 = erode_img;

m2 = My_GrayDilateErode(m1,M,'im_dilate');%开操作

Th = double(ima) - m2; %顶帽变换

Th = uint8(Th);

figure

imshow(Th);

title('Tophat变换输出结果'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %功能:实现二值图像膨胀或腐蚀

% 调用形式:imb = My_DilateErode(ima,M,option)

% 输入参数:

% ima:输入图像,

% M:输入的结构元,

% opetion:选择输出

% 输出参数:

% imb:膨胀或者腐蚀后的二值图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function imb = My_DilateErode(ima,M,option)

[m,n]=size(ima);

image_dilate = ones(m,n); % 输出膨胀图像

image_erode = zeros(m,n); % 输出腐蚀图像

Judge = zeros(3,3); % 3×3逻辑运算结果初始化

% 结构元作用于图像四周时为了不超出范围,需要将图像四周扩展

imt=zeros(m+2,n+2);

for i=2:m+1

for j=2:n+1

imt(i,j)=ima(i-1,j-1);

end

end

for i=2:m+1

for j=2:n+1

% 将结构元素与扩展图像中每3×3个模块进行与运算

Judge = M & [imt(i-1,j-1),imt(i-1,j),imt(i-1,j+1);...

imt(i,j-1),imt(i,j),imt(i,j+1);...

imt(i+1,j-1),imt(i+1,j),imt(i+1,j+1)];

% 腐蚀:只有当3×3中所有元素都与结构元的各素均不同时将此中心位置置0

if (Judge==zeros(3,3))

image_dilate(i-1,j-1)=0;

end

% 膨胀:只有当3×3中所有元素都与结构元的各素均相同时将此中心位置置1

if (Judge == ones(3,3))

image_erode(i-1,j-1)=1;

end

end

end

switch option %根据输入参数,选择输出结果

case'im_dilate'

imb = image_dilate; % 返回膨胀后的图像

case'im_erode'

imb = image_erode; % 返回腐蚀后的图像

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%功能:实现二值图像膨胀或腐蚀%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%功能:实现二值图像膨胀或腐蚀

% 调用形式:imb = My_GrayDilateErode(ima,B,option)

% 输入参数:

% ima:输入图像,

% B:输入的结构元,

% opetion:选择输出

% 输出参数:

% imb:膨胀或者腐蚀后的二值图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function imb = My_GrayDilateErode(ima,B,option)

[M,N]=size(ima);

imd=double(ima);

B=double(B);

if(strcmp(option ,'im_erode'))

im_erode=imd;

for m=4:(M-4)

for n=4:(N-4)

for x=1:3

for y=1:3

f(x,y)=imd(m-x,n-y)-B(x,y);

end

end

im_erode(m,n)=min(f(:));

end

end

imb = im_erode; % 返回腐蚀后的灰度图像

end

if(strcmp(option ,'im_dilate'))

im_dilate=imd;

for m=4:(M-4)

for n=4:(N-4)

for x=1:3

for y=1:3

f(x,y)=imd(m-x,n-y)+B(x,y);

end

end

im_dilate(m,n)=max(f(:));

end

end

imb = im_dilate; % 返回膨胀后的灰度图像

end

end

相关文档