【数字图像处理】【Matlab】【实验五】形态学图像处理


author:zox
实验环境:Matlab2019a


一、实验目的

  1. 了解形态学的基本理论和方法。
  2. 掌握对图像进行膨胀、腐蚀的方法。
  3. 掌握开闭运算。

二、实验题目

  1. 采用形态学处理方法实现图像去噪。
  2. 对图像分割实验(实验四)得到的分割结果进行形态学处理,对肺部区域的空洞进行填充。

三、实验内容

3.1 相关知识

1、形态处理学

  基本思想: 用一定形态的结构元素去量度和提取图像中的对应形状, 达到分析和识别目的。可用于图像处理的各个方面, 包括图像分割、特征抽取、边界检测等。对图像处理的理论和技术产生了重大影响,已经构成一种新的图像处理方法和理论,成为一个重要研究领域。
  这门学科在计算机文字识别, 计算机显微图像分析, 医学图像处理,工业检测等方面都取得了非常成功的应用。形态学方法已成为图像应用领域工程技术人员的必备工具。目前,有关数学形态学的技术和应用正在不断地研究和发展。
  二值形态学中的运算对象是集合。设X为图像集合, B为结构元素, 数学形态学运算是用B对X进行操作。其中结构元素本身也是一个图像集合。

2、形态学去噪

  基于形态学的方法有很多,比如腐蚀膨胀开运算闭运算就是形态学运算最基本的运算,在本次实验中我们就使用这几种运算来对有噪声的指纹图像进行去噪。
  除此之外在数学形态学图像去噪的过程中,通过适当地选取结构元素的形状和维数可以提高滤波去噪的效果。在多结构元素的级联过程中,需要考虑到结构元素的形状和维数。数字图像在进行数学形态滤波去噪时,根据噪声特点可以尝试采用维数由小到大的结构元素来进行处理,进而达到滤除不同噪声的目的。采用数学形态学的多结构元素,可以更多地保持数字图像的几何特征。比如构建串联滤波器来进行图像滤波,就是将同一形状的结构元素按维数从小到大的顺序来对图像进行滤波。

3、腐蚀原理

  图像腐蚀的基本思想是将图像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=XB=x,yBxyX

  对图像腐蚀能够消除物体边界点,使边界向内部收缩,可以把小于结构元素的物体去除。如果两个物体之间有细小的连通,当结构元素足够大时,可以将两个物体分开。
  根据结构元素的不同,通常将腐蚀分为水平腐蚀、竖直腐蚀、全方向腐蚀,本次实验中自编写的代码使用的是全方向腐蚀的结构元素。

4、膨胀原理

  图像膨胀的基本思想是对二值化图像的边界点扩充, 将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=XB=x,yBxyX=
  对图像膨胀操作可填充图像中的小孔(比结构元素小的孔洞)及图像边缘处的小凹陷部分。如果两个物体之间的距离比较近,会把两个物体连通到一起。对填补图像分割后物体中的空洞有用。
膨胀和腐蚀并不互为逆运算,可以级连结合使用。

5、开闭运算

  开运算就是使用同一个结构元素先对图像进行腐蚀然后膨胀。
  开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点), 消除小物体、平滑较大物体的边界,同时并不明显改变其面积。不过这一恢复不是信息无损的,即它们通常不等于原始图像。
开运算的公式为: S = X ∘ B = ( X ⊗ B ) ⊕ B S=X\circ B=(X\otimes B)\oplus B S=XB=(XB)B

  闭运算就是使用同一个结构元素先对图像进行膨胀然后腐蚀。
  闭运算用来填充物体内细小空洞、连接邻近物体、平滑其边界,同时不明显改变其面积。
闭运算的公式为: S = X ∙ B = ( X ⊕ B ) ⊗ B S=X\bullet B=(X⊕B)⊗B S=XB=(XB)B

6、实验中直接使用的函数

(1)imread(path)函数:从图像所在路径读取图像的数据信息存为矩阵。
(2)imshow(image)函数:将读取到的图像显示到figure中。
(3)subplot(m,n,p)函数
subplot函数是将多个图画到一个平面上的工具。其中m、n表示一个m行n列的大画框,可显示 m ∗ n m*n mn个图 ,p表示图所在位置。
(4)构造函数
function[输出形参]=函数名([输入形参])
函数体
(5)size()函数
[m,n] = size(X)
返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。
(6)zeros(m,n)函数:产生 m ∗ n m*n mn的double类型零矩阵。
(7)im2bw(x):二值化(即转化为逻辑值)。
(8)sum():求和
(9)nargin:判断函数输入参数的数目参数。用于控制函数如果没有输入这个参数可使用函数默认的,或者根据不同的参数有不同的选择,使得自编写的函数功能更加完善。

3.2 实验代码

【sy5.m】

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.m】

% 函数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.m】

% 函数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

【myopen.m】

% 函数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.m】

% 函数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

3.3 实验结果

在这里插入图片描述

图1 指纹形态学去噪
  图1为对有噪声的指纹图像进行一系列的操作过程,比较最后一张结果图与第一张原图,降噪效果还是比较明显的。步骤如下:
  1. 首先对原图膨胀,使得指纹区域的一些黑色的噪声造成的空洞能够被补充;
  2. 然后再通过一系列的开运算使得指纹的一些毛刺消失;
  3. 接下来通过对图像腐蚀和闭运算去除背景区域的一些白色噪声;
  4. 最后再进行一次膨胀操作恢复,使得形态学处理的过程中指纹的面积不发生巨大的改变。
    在这里插入图片描述
图2 实验4-肺形态学处理
  实验4处理后的图像虽然将肺部区域与背景明显分隔开,但肺部区域还有一些明显的黑色部分,通过一系列的膨胀、闭运算、腐蚀操作最终得到白色的肺部区域。

四、实验心得

  1. 了解了形态学的基本理论和方法。通过对于腐蚀、膨胀、开运算、闭运算代码的编写,以及对图片处理的过程中对于他们的作用更加理解。
  2. 对于指纹的处理结果虽然没有完全去除噪声,还使得指纹在某些地方有一些断裂,但相对于原图效果还是很明显的,接下来可使用其他的方法再做进一步的处理。
  3. 图像的形态学处理还有细化、中轴变换、顶帽变换等等,使用这些方法能够更好的处理图像,得到所需要的信息。
  • 9
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
很高兴回答关于数字图像处理MATLAB中的问题。如果您想了解有关数字图像处理的知识,我将尽力帮助您。 在MATLAB中进行数字图像处理可以利用Image Processing Toolbox。该工具箱提供了许多功能和算法,用于处理、分析和操作数字图像。以下是一些常见的数字图像处理操作和在MATLAB中执行它们的方法: 1. 读取和显示图像: 使用`imread`函数读取图像文件,并使用`imshow`函数显示图像。 2. 调整图像大小: 使用`imresize`函数可以调整图像的大小。 3. 图像滤波: MATLAB提供了许多滤波器函数,如平滑滤波、锐化滤波等。常见的滤波器函数包括`imfilter`、`fspecial`和`imsharpen`。 4. 图像增强: 使用直方图均衡化可以增强图像的对比度,使用`histeq`函数可以进行直方图均衡化。 5. 边缘检测: 常用的边缘检测算法包括Sobel、Prewitt和Canny算子。MATLAB提供了`edge`函数来执行这些算子。 6. 形态学操作: 形态学操作是一组基于形状的图像处理操作,如膨胀、腐蚀、开运算和闭运算。MATLAB提供了`imdilate`、`imerode`、`imopen`和`imclose`等函数来执行这些操作。 7. 图像分割: 图像分割是将图像分成不同的区域或对象的过程。MATLAB提供了许多分割算法,如阈值分割、区域增长等。常用的函数包括`graythresh`、`imbinarize`和`regiongrowing`。 以上只是数字图像处理中的一小部分操作,MATLAB提供了更多功能和算法来处理数字图像。希望这些信息对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoxiii

越打赏越生长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值