MATLAB数字图像的腐蚀、填充、细化与粗化_第1页
MATLAB数字图像的腐蚀、填充、细化与粗化_第2页
MATLAB数字图像的腐蚀、填充、细化与粗化_第3页
MATLAB数字图像的腐蚀、填充、细化与粗化_第4页
MATLAB数字图像的腐蚀、填充、细化与粗化_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字图像处理实验报告姓名 学号 专业 电子科学与工程学院实验 5一、 实验目的本次实验的处理对象是二值图像,关于二值图像的处理运算主要包括腐蚀和膨胀。它们是其他处理过程的主要运算环节。开闭操作通过腐蚀和膨胀的不同顺序组合,能够使图像平滑,开闭操作再组合能够成噪声滤波器。形态学中的击中击不中变换也应用了腐蚀的运算,用于判断图像中能否找到目标结构,这在图像细化中也得到了应用。本次实验主要实现:1 图像的边缘提取;2 在边缘提取的基础上实现区域填充;3 在区域填充的基础上实现图像细化;4 在图像细化的基础上实现图像粗化。在Matlab软件的自带函数库中其实本身就包含有以上处理过程的函数,为了深入理解

2、每种处理过程的原理,本次实验所有运算都自行编写实现。二、 核心代码及运行后截图主函数:% 读取图像clear;clc;I = imread('onepiece.jpg');I = im2bw(I);% 转换为二值图像m,n = size(I); % 边界提取f = im2bw(0,1,0;1,1,1;0,1,0);% 腐蚀用的结构元素F = fs(I,f);BW = im2bw(I-F);% 用原图减去腐蚀获得边缘figure;imshow(I);title('原图');figure;imshow(F);title('腐蚀图像');figure;

3、imshow(BW);title('边界'); 在上面的运行效果图上看来,由于原图选择的原因,周围一圈白线有一定宽度但不足够粗,大概只有23个像素宽度而腐蚀用元素大小为3×3,这导致腐蚀后图像留下的白线看起来残缺不全,用原图减去腐蚀后得到的边缘图像也在白线处有“粘在一块”的现象。只要使用更高一些分辨率的图片即可避免这样的情况。但出于后续试验的运行速度考虑,本实验就使用此图(300×300)。观察图像其他地方,有足够的像素宽度被腐蚀,由此提取的边缘也很清晰。% 区域填充I1 = fillbw(BW,40,40);% fillbw函数实现指定坐标填充边缘内部,详

4、见主函数后的各子函数I1 = I1 | fillbw(BW,40,260);% 为避免不必要的计算量,每次填充迭代次数为70I1 = I1 | fillbw(BW,100,150);% 逐次在图像中选择需填充区域中的起始点以完成填充I1 = I1 | fillbw(BW,100,160);I1 = I1 | fillbw(BW,136,86);I1 = I1 | fillbw(BW,132,212);I1 = I1 | fillbw(BW,147,120);I1 = I1 | fillbw(BW,157,214);I1 = I1 | fillbw(BW,210,171);I1 = I1 | f

5、illbw(BW,206,109);I1 = I1 | fillbw(BW,233,129);I1 = I1 | fillbw(BW,234,140);I1 = I1 | fillbw(BW,237,153);I1 = I1 | fillbw(BW,234,167);I1 = I1 | fillbw(BW,231,178);I1 = I1 | fillbw(BW,248,125);I1 = I1 | fillbw(BW,252,142);I1 = I1 | fillbw(BW,252,162);I1 = I1 | fillbw(BW,247,182);I1 = I1 | fillbw(BW,2

6、72,149);I1 = I1 | fillbw(BW,256,50);I1 = I1 | fillbw(BW,253,248);I2 = I1 | F;% 因外围白线边缘之间没有足够空间,很难逐个填充空洞figure;% 故此处直接叠加腐蚀图像,把外围白线加上subplot(1,3,1);imshow(I);title('原图');subplot(1,3,2);imshow(I1);title('区域填充');subplot(1,3,3);imshow(I2);title('区域填充+腐蚀'); 实际上边缘图像是由原图像减去腐蚀图像得到的,而区

7、域填充是在边缘图像的区域内填满的结果,故理论上来说最后区域填充的结果其实就是原来的腐蚀图像。从上图比较就可以看出,除了区域填充中未填的外围白线外,叠加了腐蚀图像的结果与区域填充是一样的,也与腐蚀图像一样(具体可以查看附件中的”区域填充.jpg”、”腐蚀.jpg”和”区域填充+腐蚀.jpg”)。% 细化A1 = fs(I2,20);figure;imshow(A1); 实验效果图显示细化结果良好,表征了原图像的主要骨架特征。在实现细化算法过程中,一开始在判定是否满足结构元素时采用的方法是实现写好一个元胞数组Bk,然后在程序中调用数组进行比较。后来发现这样的运算速度大大降低,改为在程序中现写结构元

8、素矩阵。% 粗化A2 = fs(A1,2);figure;imshow(A2);从上图看出在细化得到的骨架基础上,粗化得到的结果已经失去了原图像骨架之外的信息了,只能够把骨架大致的等宽度变粗而已。虽然粗化与细化在运算上是对偶的,但不同于加减法、乘除法的对偶,由于细化过程中图像逐个减去判定击中点,余留图像的信息量实际在减少,作为骨架的剩余信息已不足够做恢复原状的逆运算。图像中粗化线条中掺杂了很多间断,这是由于间断处两边在判定击中而粗化后,中间点的形状不能满足判定结构元素中的任何一个,故不作为击中点而没有填白。子函数:function Y = fs( A,f )% fs函数实现用结构元素模板f将图

9、像A腐蚀% 输入:A被腐蚀图像% f结构元素,此函数只编写了方形情% 况,大小可自定义m,n = size(A);% 获取图像大小 l = (size(f)-1)/2;Y = im2bw(zeros(m,n);% 初始化输出为0矩阵for i = 1+l:m-l% 遍历图像中3×3区域,若能放下结构元素f,则该点填白 for j = 1+l:n-l if (sum(sum(A(i-l:i+l,j-l:j+l) & f) = sum(f(:) Y(i,j) = 1; end endend endfunction Y = fillbw( A,x,y)%fillbw函数实现在图像A

10、的第x行、第y列处开始,在边缘区域内填充白色% 输入:A需填充图像% x起始点行数% y起始点列数% 避免小块区域填充时间过久,迭代次数不宜取过大,为方便调用,本函数在函数内部固定为70次m,n = size(A);YY(:,:,1) = zeros(m,n);% 起始图像为0矩阵YY(x,y,1) = 1;% 从指定位置开始填充f = 0,1,0;1,1,1;0,1,0;for k = 2:70% 填充迭代70次 YY(:,:,k) = zeros(m,n); for i = 2:m-1% YY(k)为YY(k-1)的膨胀图像 for j = 2:n-1 if YY(i,j,k-1) = 1

11、 YY(i-1:i+1,j-1:j+1,k) = YY(i-1:i+1,j-1:j+1,k) | f; end end end YY(:,:,k) = YY(:,:,k) & not(A);% 膨胀后与边界的取反图像相与,保证不溢出边界endY = YY(:,:,70);% 输出为第70次填充结果end function Y = fs( A,count )%fs函数将图像A细化count次% 输入:A细化图像% count细化迭代次数m,n = size(A);Y = A;for k = 1:count% 设定迭代次数YY = ones(m,n);% 初始化中间变量for i = 2:

12、n-1 for j = 2:m-1% 在图像中寻找8个结构对元素位置并涂黑(即细化) if Y(j-1,i-1) = 0 && Y(j,i-1) = 0 && Y(j+1,i-1) = 0 && Y(j,i) = 1 && Y(j-1,i+1) = 1 && Y(j,i+1) = 1 && Y(j+1,i+1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j,i-1

13、) = 0 && Y(j+1,i-1) = 0 && Y(j+1,i) = 0 && Y(j,i) = 1 && Y(j-1,i) = 1 && Y(j-1,i+1) = 1 && Y(j,i+1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j+1,i-1) = 0 && Y(j+1,i) = 0 && Y(j+1,i+1) = 0

14、 && Y(j,i) = 1 && Y(j-1,i) = 1 && Y(j-1,i+1) = 1 && Y(j-1,i-1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j+1,i) = 0 && Y(j+1,i+1) = 0 && Y(j,i+1) = 0 && Y(j,i) = 1 && Y(j,i-1) = 1 &&am

15、p; Y(j-1,i) = 1 && Y(j-1,i-1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j-1,i-1) = 1 && Y(j,i-1) = 1 && Y(j+1,i-1) = 1 && Y(j,i) = 1 && Y(j-1,i+1) = 0 && Y(j,i+1) = 0 && Y(j+1,i+1) = 0 YY(j,i) = 0

16、; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j,i-1) = 1 && Y(j,i) = 1 && Y(j+1,i-1) = 1 && Y(j+1,i) = 1 && Y(j-1,i) = 0 && Y(j-1,i+1) = 0 && Y(j,i+1) = 0 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 f

17、or j = 2:m-1 if Y(j+1,i-1) = 1 && Y(j+1,i) = 1 && Y(j+1,i+1) = 1 && Y(j,i) = 1 && Y(j-1,i) = 0 && Y(j-1,i+1) = 0 && Y(j-1,i-1) = 0 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j+1,i+1) = 1 && Y(j+1,i) =

18、1 && Y(j,i+1) = 1 && Y(j,i) = 1 && Y(j-1,i) = 0 && Y(j,i-1) = 0 && Y(j-1,i-1) = 0 YY(j,i) = 0; end endendY = Y & YY;endend三、 实验分析本次实验主要程序全部自行编写完成,主要是在实现算法的过程中理解每种处理方法的原理。二值图像的处理主要是通过矩阵加减法、逻辑值的与或非运算以及集合的运算。腐蚀运算的形象定义是用一个小元素在原图像内,保证不超出边界的移动,其中心移动的位置集合就是腐蚀结果。按照这个定义,在图像内遍历每个与结构元素同大小的分块矩阵,与结构元素做与运算后(保留结构元素非零位置的值)与结构元素比较,若相同则表示结构元素在该位置没有超出边界,此处填白。不过处理的图像区域如果太小,就很难能使结构元素不超出边界,就会造成实验图像外围白线处理效果不明显的现象。经过一次腐蚀运算后,大部分情况是图像的外围被消除了一圈像素,因此此时用原图减去腐蚀图像的话得到的结果就很接近原图像的边缘,这是本次实验中提取边缘的原理。不过因为外围白线的腐蚀效果不好,所以其边缘提取的效果也会不好,看起来是两条边缘黏在一起。图像细化一定程度上算是对图像的一种特殊的腐蚀过程。用常见的边缘结构作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论