MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx

上传人:wj 文档编号:1451158 上传时间:2023-04-30 格式:DOCX 页数:10 大小:417.61KB
下载 相关 举报
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第1页
第1页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第2页
第2页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第3页
第3页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第4页
第4页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第5页
第5页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第6页
第6页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第7页
第7页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第8页
第8页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第9页
第9页 / 共10页
MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx

《MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx》由会员分享,可在线阅读,更多相关《MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx(10页珍藏版)》请在冰点文库上搜索。

MATLAB数字图像的腐蚀填充细化与粗化Word下载.docx

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('

原图'

imshow(F);

腐蚀图像'

imshow(BW);

边界'

在上面的运行效果图上看来,由于原图选择的原因,周围一圈白线有一定宽度但不足够粗,大概只有2~3个像素宽度而腐蚀用元素大小为3×

3,这导致腐蚀后图像留下的白线看起来残缺不全,用原图减去腐蚀后得到的边缘图像也在白线处有“粘在一块”的现象。

只要使用更高一些分辨率的图片即可避免这样的情况。

但出于后续试验的运行速度考虑,本实验就使用此图(300×

300)。

观察图像其他地方,有足够的像素宽度被腐蚀,由此提取的边缘也很清晰。

%%区域填充

I1=fillbw(BW,40,40);

%fillbw函数实现指定坐标填充边缘内部,详见主函数后的各子函数

I1=I1|fillbw(BW,40,260);

%为避免不必要的计算量,每次填充迭代次数为70

I1=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|fillbw(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,272,149);

I1=I1|fillbw(BW,256,50);

I1=I1|fillbw(BW,253,248);

I2=I1|F;

%因外围白线边缘之间没有足够空间,很难逐个填充空洞

%故此处直接叠加腐蚀图像,把外围白线加上

subplot(1,3,1);

subplot(1,3,2);

imshow(I1);

区域填充'

subplot(1,3,3);

imshow(I2);

区域填充+腐蚀'

实际上边缘图像是由原图像减去腐蚀图像得到的,而区域填充是在边缘图像的区域内填满的结果,故理论上来说最后区域填充的结果其实就是原来的腐蚀图像。

从上图比较就可以看出,除了区域填充中未填的外围白线外,叠加了腐蚀图像的结果与区域填充是一样的,也与腐蚀图像一样(具体可以查看附件中的”区域填充.jpg”、”腐蚀.jpg”和”区域填充+腐蚀.jpg”)。

%%细化

A1=fs(I2,20);

imshow(A1);

实验效果图显示细化结果良好,表征了原图像的主要骨架特征。

在实现细化算法过程中,一开始在判定是否满足结构元素时采用的方法是实现写好一个元胞数组B{k},然后在程序中调用数组进行比较。

后来发现这样的运算速度大大降低,改为在程序中现写结构元素矩阵。

%%粗化

A2=fs(~A1,2);

imshow(~A2);

从上图看出在细化得到的骨架基础上,粗化得到的结果已经失去了原图像骨架之外的信息了,只能够把骨架大致的等宽度变粗而已。

虽然粗化与细化在运算上是对偶的,但不同于加减法、乘除法的对偶,由于细化过程中图像逐个减去判定击中点,余留图像的信息量实际在减少,作为骨架的剩余信息已不足够做恢复原状的逆运算。

图像中粗化线条中掺杂了很多间断,这是由于间断处两边在判定击中而粗化后,中间点的形状不能满足判定结构元素中的任何一个,故不作为击中点而没有填白。

子函数:

function[Y]=fs(A,f)

%fs函数实现用结构元素模板f将图像A腐蚀

%输入:

A——被腐蚀图像

% f——结构元素,此函数只编写了方形情

% 况,大小可自定义

[m,n]=size(A);

%获取图像大小

l=(size(f)-1)/2;

Y=im2bw(zeros(m,n));

%初始化输出为0矩阵

fori=1+l:

m-l %遍历图像中3×

3区域,若能放下结构元素f,则该点填白

forj=1+l:

n-l

if(sum(sum(A(i-l:

i+l,j-l:

j+l)&

f))==sum(f(:

)))

Y(i,j)=1;

end

end

end

function[Y]=fillbw(A,x,y)

%fillbw函数实现在图像A的第x行、第y列处开始,在边缘区域内填充白色

%输入:

A——需填充图像

% x——起始点行数

% y——起始点列数

%避免小块区域填充时间过久,迭代次数不宜取过大,为方便调用,本函数在函数内部固定为70次

YY(:

:

1)=zeros(m,n);

%起始图像为0矩阵

YY(x,y,1)=1;

%从指定位置开始填充

f=[0,1,0;

0,1,0];

fork=2:

70 %填充迭代70次

YY(:

k)=zeros(m,n);

fori=2:

m-1 %YY(k)为YY(k-1)的膨胀图像

forj=2:

n-1

ifYY(i,j,k-1)==1

YY(i-1:

i+1,j-1:

j+1,k)=YY(i-1:

j+1,k)|f;

end

k)=YY(:

k)&

not(A);

%膨胀后与边界的取反图像相与,保证不溢出边界

Y=YY(:

70);

%输出为第70次填充结果

function[Y]=fs(A,count)

%fs函数将图像A细化count次

A——细化图像

% count——细化迭代次数

Y=A;

fork=1:

count %设定迭代次数

YY=ones(m,n);

%初始化中间变量

fori=2:

forj=2:

m-1 %在图像中寻找8个结构对元素位置并涂黑(即细化)

ifY(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;

Y=Y&

YY;

m-1

ifY(j,i-1)==0&

Y(j+1,i)==0&

Y(j-1,i)==1&

Y(j,i+1)==1

ifY(j+1,i-1)==0&

Y(j+1,i+1)==0&

Y(j-1,i-1)==1

ifY(j+1,i)==0&

Y(j,i+1)==0&

Y(j,i-1)==1&

ifY(j-1,i-1)==1&

Y(j+1,i-1)==1&

Y(j-1,i+1)==0&

Y(j+1,i+1)==0

ifY(j,i-1)==1&

Y(j+1,i)==1&

Y(j-1,i)==0&

Y(j,i+1)==0

ifY(j+1,i-1)==1&

Y(j+1,i+1)==1&

Y(j-1,i-1)==0

ifY(j+1,i+1)==1&

三、实验分析

本次实验主要程序全部自行编写完成,主要是在实现算法的过程中理解每种处理方法的原理。

二值图像的处理主要是通过矩阵加减法、逻辑值的与或非运算以及集合的运算。

腐蚀运算的形象定义是用一个小元素在原图像内,保证不超出边界的移动,其中心移动的位置集合就是腐蚀结果。

按照这个定义,在图像内遍历每个与结构元素同大小的分块矩阵,与结构元素做与运算后(保留结构元素非零位置的值)与结构元素比较,若相同则表示结构元素在该位置没有超出边界,此处填白。

不过处理的图像区域如果太小,就很难能使结构元素不超出边界,就会造成实验图像外围白线处理效果不明显的现象。

经过一次腐蚀运算后,大部分情况是图像的外围被消除了一圈像素,因此此时用原图减去腐蚀图像的话得到的结果就很接近原图像的边缘,这是本次实验中提取边缘的原理。

不过因为外围白线的腐蚀效果不好,所以其边缘提取的效果也会不好,看起来是两条边缘黏在一起。

图像细化一定程度上算是对图像的一种特殊的腐蚀过程。

用常见的边缘结构作为腐蚀元素,不断对图像外层消除,最后留下单像素宽度的图像,这就是原图像的”骨架“,表现其主要形态分布和走向。

但一开始没有理解好8个结构对元素的正确使用方法,把重点放在了击中击不中变换的实现过程上,用8个结构对元素通过腐蚀、求补、交集等大量运算实现目标匹配和背景匹配,然后再确定击中点,最后才细化一下,耗费大量计算时间。

实际上用8个结构对元素在图像中对比的过程就是包含了目标匹配和背景匹配,直接可以寻找击中位置而不需要反复循环腐蚀运算。

图像粗化是图像细化的对偶运算,可以有2种算法来实现:

1.通过对原图的补集进行细化,然后取处理结果的补集即为粗化结果;

2.用原图并上击中区域。

这两种算法实质上是等价的,由于之前已写好了细化程序,这里取前者可以直接调用函数,比较方便。

本次实验深入了解了腐蚀图像的运算细节,还有提取边缘的一种算法,和图像形态骨架如何通过细化算法获取。

主要经过一个误解算法的过程,查阅了较多资料和经过较多尝试,对击中击不中变换也有一些更深的理解。

在网上找到了击中击不中变换的运算方程为

A*B=(AΘB)∩(ACΘW-B)

其中B是判定击中的结构元素,而W是一个比B大的模板,它通过等式右边的目标匹配和背景匹配两部分判定区域取交集,最终确定包含结果B的区域位置。

如果通过上式求出击中位置,得到的是图像中与B完全相同的区域位置。

而本实验查找的不是要与结构对元素完全一样的区域,而是要对包含这些结构的区域进行细化,故如果用上式来找出击中区域反而难以获得良好的细化效果。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2