author:zox
实验环境:Matlab2019a
基本思想: 用一定形态的结构元素去量度和提取图像中的对应形状, 达到分析和识别目的。可用于图像处理的各个方面, 包括图像分割、特征抽取、边界检测等。对图像处理的理论和技术产生了重大影响,已经构成一种新的图像处理方法和理论,成为一个重要研究领域。
这门学科在计算机文字识别, 计算机显微图像分析, 医学图像处理,工业检测等方面都取得了非常成功的应用。形态学方法已成为图像应用领域工程技术人员的必备工具。目前,有关数学形态学的技术和应用正在不断地研究和发展。
二值形态学中的运算对象是集合。设X为图像集合, B为结构元素, 数学形态学运算是用B对X进行操作。其中结构元素本身也是一个图像集合。
基于形态学的方法有很多,比如腐蚀
、膨胀
、开运算
、闭运算
就是形态学运算最基本的运算,在本次实验中我们就使用这几种运算来对有噪声的指纹图像进行去噪。
除此之外在数学形态学图像去噪的过程中,通过适当地选取结构元素的形状和维数可以提高滤波去噪的效果。在多结构元素的级联过程中,需要考虑到结构元素的形状和维数。数字图像在进行数学形态滤波去噪时,根据噪声特点可以尝试采用维数由小到大的结构元素来进行处理,进而达到滤除不同噪声的目的。采用数学形态学的多结构元素,可以更多地保持数字图像的几何特征。比如构建串联滤波器来进行图像滤波,就是将同一形状的结构元素按维数从小到大的顺序来对图像进行滤波。
图像腐蚀的基本思想是将图像X中每一与结构元素B全等的子集S+x收缩为点x。具体就是比较S+x与结构元素B的像素,当完全相同时就保留像素点x,否则就删除该点(即将该点转换为背景色),对图像X的所有点处理完即完成了一次腐蚀过程。公式如下:
S = X ⊗ B = x , y ∣ B x y ⊆ X S=X\otimes B={x,y|B_{xy}\subseteq X} S=X⊗B=x,y∣Bxy⊆X
对图像腐蚀能够消除物体边界点,使边界向内部收缩,可以把小于结构元素的物体去除。如果两个物体之间有细小的连通,当结构元素足够大时,可以将两个物体分开。
根据结构元素的不同,通常将腐蚀分为水平腐蚀、竖直腐蚀、全方向腐蚀,本次实验中自编写的代码使用的是全方向腐蚀的结构元素。
图像膨胀的基本思想是对二值化图像的边界点扩充, 将X中的每一个点x扩大为B+x,将与物体接触的所有背景点合并到该物体中, 使边界向外部扩张。具体就是比较S+x与结构元素B的像素,只要有一个相同就就保留像素点x,否则处理为背景色。公式如下:
S = X ⊕ B = x , y ∣ B x y ∩ X ≠ ∅ S=X\oplus B={x,y|B_{xy}\cap X\neq\emptyset} S=X⊕B=x,y∣Bxy∩X=∅
对图像膨胀操作可填充图像中的小孔(比结构元素小的孔洞)及图像边缘处的小凹陷部分。如果两个物体之间的距离比较近,会把两个物体连通到一起。对填补图像分割后物体中的空洞有用。
膨胀和腐蚀并不互为逆运算,可以级连结合使用。
开运算就是使用同一个结构元素先对图像进行腐蚀然后膨胀。
开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点), 消除小物体、平滑较大物体的边界,同时并不明显改变其面积。不过这一恢复不是信息无损的,即它们通常不等于原始图像。
开运算的公式为: S = X ∘ B = ( X ⊗ B ) ⊕ B S=X\circ B=(X\otimes B)\oplus B S=X∘B=(X⊗B)⊕B
闭运算就是使用同一个结构元素先对图像进行膨胀然后腐蚀。
闭运算用来填充物体内细小空洞、连接邻近物体、平滑其边界,同时不明显改变其面积。
闭运算的公式为: S = X ∙ B = ( X ⊕ B ) ⊗ B S=X\bullet B=(X⊕B)⊗B S=X∙B=(X⊕B)⊗B
(1)imread(path)函数:从图像所在路径读取图像的数据信息存为矩阵。
(2)imshow(image)函数:将读取到的图像显示到figure中。
(3)subplot(m,n,p)函数
subplot函数是将多个图画到一个平面上的工具。其中m、n表示一个m行n列的大画框,可显示 m ∗ n m*n m∗n个图 ,p表示图所在位置。
(4)构造函数
function[输出形参]=函数名([输入形参])
函数体
(5)size()函数
[m,n] = size(X)
返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。
(6)zeros(m,n)函数:产生 m ∗ n m*n m∗n的double类型零矩阵。
(7)im2bw(x):二值化(即转化为逻辑值)。
(8)sum():求和
(9)nargin:判断函数输入参数的数目参数。用于控制函数如果没有输入这个参数可使用函数默认的,或者根据不同的参数有不同的选择,使得自编写的函数功能更加完善。
clear all;close all;clc;
%% 1、采用形态学处理方法实现图像去噪。
I=imread('Fig0911(a).tif');
model=[0,1,0;1,1,1;0,1,0]; %定义3×3模板(背景色为黑色)
I1=myswell(I,model);%膨胀
I2=myclose(I1,model,5);%闭运算
I3=mycorrode(I2,model,2);%腐蚀
I4=myopen(I3,model,5);%开运算
I5=myswell(I4,model);%膨胀
figure,suptitle('指纹去噪'); %Figure 1
subplot(231),imshow(I),axis on,title('指纹(有噪声)');
subplot(232),imshow(I1),axis on,title('膨胀1次');
subplot(233),imshow(I2),axis on,title('闭运算5次');
subplot(234),imshow(I3),axis on,title('腐蚀2次');
subplot(235),imshow(I4),axis on,title('开运算5次');
subplot(236),imshow(I5),axis on,title('膨胀1次');
%% 2、对图像分割实验(实验四)得到的分割结果进行形态学处理,对肺部区域的空洞进行填充。
L=imread('实验四_肺分割后.tif');
model=[0,1,0;1,1,1;0,1,0]; %定义3×3模板
S=myswell(L,model,6);%膨胀
S1=myclose(S,model,5);%闭运算
S2=mycorrode(S1,model,6);%腐蚀
figure,suptitle('肺-形态学处理');%Figure 2
subplot(221),imshow(L),axis on,title('原图');
subplot(222),imshow(S),axis on,title('膨胀6次');
subplot(223),imshow(S1),axis on,title('闭运算5次');
subplot(224),imshow(S2),axis on,title('腐蚀6次');
% 函数mycorrode:根据模板对图像进行腐蚀操作
% 输入参数:I:原图像
% modelx:模板(对于背景色为黑色)
% 有参数n(n>0):执行n次(递归实现)
% 无参数n:执行一次
% 输出参数:腐蚀后的图像数据OUT
% 使用函数:nargin:判断函数输入参数的数目参数
% size(x):求矩阵大小
% zeros():为矩阵分配空间
% im2bw(x):二值化(即转化为逻辑值)
% sum():求和
function OUT=mycorrode(I,model,n)
if nargin ==2
[x,y]=size(I); %获取原图像的大小
w=(size(model)-1)/2;
OUT=im2bw(zeros(x,y));
for i=w+1:x-1
for j=w+1:y-1
if(sum(sum(I(i-w:i+w,j-w:j+w)&model))==sum(model(:)))
OUT(i,j)=1;
end
end
end
elseif nargin>2
[x,y]=size(I); %获取原图像的大小
w=(size(model)-1)/2;
OUT=im2bw(zeros(x,y));
for i=w+1:x-1
for j=w+1:y-1
if(sum(sum(I(i-w:i+w,j-w:j+w)&model))==sum(model(:)))
OUT(i,j)=1;
end
end
end
n=n-1;
if n>0
OUT=mycorrode(OUT,model,n);
end
end
% 函数myswell:根据模板对图像进行膨胀操作
% 输入参数:I:原图像
% modelx:模板(对于背景色为黑色)
% 有参数n(n>0):执行n次(递归实现)
% 无参数n:执行一次
% 输出参数:膨胀后的图像数据OUT
% 使用函数:nargin:判断函数输入参数的数目参数
% size(x):求矩阵大小
% zeros():为矩阵分配空间
% im2bw(x):二值化(即转化为逻辑值)
% sum():求和
function OUT=myswell(I,model,n)
if nargin ==2
[x,y]=size(I); %获取原图像的大小
w=(size(model)-1)/2;
OUT=im2bw(zeros(x,y));
for i=w+1:x-1
for j=w+1:y-1
if(sum(sum(I(i-w:i+w,j-w:j+w)&model))>0)
OUT(i,j)=1;
end
end
end
elseif nargin>2
[x,y]=size(I); %获取原图像的大小
w=(size(model)-1)/2;
OUT=im2bw(zeros(x,y));
for i=w+1:x-1
for j=w+1:y-1
if(sum(sum(I(i-w:i+w,j-w:j+w)&model))>0)
OUT(i,j)=1;
end
end
end
n=n-1;
if n>0
OUT=myswell(OUT,model,n);
end
end
% 函数myclose:根据模板对图像进行开运算
% 输入参数:I:原图像
% modelx:模板(对于背景色为黑色)
% 有参数n(n>0):执行n次(递归实现)
% 无参数n:执行一次
% 输出参数:开运算后的图像数据OUT
% 使用函数:nargin:判断函数输入参数的数目参数
% myswell():膨胀
% mycorrode():腐蚀
function OUT =myopen(I,model,n)
if nargin ==2
OUT=mycorrode(I,model);%先腐蚀后膨胀
OUT=myswell(OUT,model);
elseif nargin>2
OUT=mycorrode(I,model);
OUT=myswell(OUT,model);
n=n-1;
if n>0
OUT=myclose(OUT,model,n);
end
end
% 函数myclose:根据模板对图像进行闭运算
% 输入参数:I:原图像
% modelx:模板(对于背景色为黑色)
% 有参数n(n>0):执行n次(递归实现)
% 无参数n:执行一次
% 输出参数:闭运算后的图像数据OUT
% 使用函数:nargin:判断函数输入参数的数目参数
% myswell():膨胀
% mycorrode():腐蚀
function OUT=myclose(I,model,n)
if nargin ==2
OUT=myswell(I,model);%先膨胀后腐蚀
OUT=mycorrode(OUT,model);
elseif nargin>2
OUT=myswell(I,model);
OUT=mycorrode(OUT,model);
n=n-1;
if n>0
OUT=myclose(OUT,model,n);
end
end