- 我是将 1白视为主体,0黑视为背景
- 结构元素的中心在图像的边界的时候,会有导致结构元素的一部分在图像外,所以我在处理图像的时候先将图像放大
%BW是待处理图像
[Width,Length]=size(BW);
BIG_BW=zeros(Width+2,Length+2);
for i=1:Width
for j=1:Length
BIG_BW(i+1,j+1)=BW(i,j);%扩大图像
end
end
CORE = [0 1 0;
1 1 1;
0 1 0];%核
CORE_num=length(find(CORE==1) );%核中1的个数
CORE_count_num=0;%遍历过程中数到的1的个数
腐蚀
一个待处理对象X,一个结构元素S,S对X的腐蚀得到的结果是由X中能够包含整个S的像素点所组成的。
我的理解:
将S的中心依次放到主体X的每个像素点上,如果S触碰到了X的外部(背景),那么这个像素点就由主体变为了背景
我的操作:
用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。
%---------腐蚀---------
for i=2:Width+1
for j=2:Length+1
for m =-1:1
for n =-1:1
if (BIG_BW(i+m,j+n)&CORE(2+m,2+n) )==1
CORE_count_num=CORE_count_num+1;
end
end
end
if CORE_count_num<CORE_num
img_fushi(i-1,j-1)=0;%不符合条件,被腐蚀掉
end
CORE_count_num=0;
end
end
文章来源地址https://www.toymoban.com/news/detail-447450.html
膨胀
S对X膨胀产生的二值图像D是由这样的点(x, y )组成的集合,如果S的原点位移到(x, y ),那么它与X的交集非空。
我的理解:
将S的中心依次放到主体X的每个像素点上,如果S触碰到了X的外部(背景),那么这个被触碰到的外部像素点,就由背景变为了主体
也就是将S'的中心依次放到背景的每个像素点上,如果S'触碰到了X,那么这个像素点就由背景变为了主体。
(S'是S关于中心的对称,因为
假设背景在主体的右下角
那么主体在背景的左上角)
我的操作:
用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果存在1,则该像素为1,否则为0。
%---------膨胀---------
CORE_change=CORE;
for m =-1:1
for n =-1:1
CORE_change(2-m,2-n)=CORE(2+m,2+n);%作核关于中心的反射
end
end
for i=2:Width+1
for j=2:Length+1
for m =-1:1
for n =-1:1
if (BIG_BW(i+m,j+n)&CORE(2+m,2+n) )==1
CORE_count_num=CORE_count_num+1;
end
end
end
if CORE_count_num~=0
img_pengzhang(i-1,j-1)=1;%只要周围有一个点符合,就变为主体
end
CORE_count_num=0;
end
end
开运算
开运算 = 先腐蚀运算,再膨胀运算。
%---------开运算(先腐蚀,再膨胀)---------
img_open_interim=img_open;%过渡图像
BIG_open=zeros(Width+2,Length+2);
CORE_change=CORE;
for m =-1:1
for n =-1:1
CORE_change(2-m,2-n)=CORE(2+m,2+n);%作核关于中心的反射
end
end
%先腐蚀
for i=2:Width+1
for j=2:Length+1
for m =-1:1
for n =-1:1
if (BIG_BW(i+m,j+n)&CORE(2+m,2+n) )==1
CORE_count_num=CORE_count_num+1;
end
end
end
if CORE_count_num<CORE_num
img_open_interim(i-1,j-1)=0;
end
CORE_count_num=0;
end
end
%再膨胀
img_open=img_open_interim;
for i=1:Width
for j=1:Length
BIG_open(i+1,j+1)=img_open_interim(i,j);%扩大图像
end
end
for i=2:Width+1
for j=2:Length+1
for m =-1:1
for n =-1:1
if (BIG_open(i+m,j+n)&CORE(2+m,2+n) )==1
CORE_count_num=CORE_count_num+1;
end
end
end
if CORE_count_num~=0
img_open(i-1,j-1)=1;
end
CORE_count_num=0;
end
end
闭运算
闭运算 = 先膨胀运算,再腐蚀运算。
%---------闭运算(先膨胀,再腐蚀)---------
img_close_interim=img_close;%过渡图像
BIG_close=zeros(Width+2,Length+2);
CORE_change=CORE;
for m =-1:1
for n =-1:1
CORE_change(2-m,2-n)=CORE(2+m,2+n);%作核关于中心的反射
end
end
%先膨胀
for i=2:Width+1
for j=2:Length+1
for m =-1:1
for n =-1:1
if (BIG_BW(i+m,j+n)&CORE(2+m,2+n) )==1
CORE_count_num=CORE_count_num+1;
end
end
end
if CORE_count_num~=0
img_close_interim(i-1,j-1)=1;%只要周围有一个点符合,就变为主体
end
CORE_count_num=0;
end
end
%再腐蚀
img_close=img_close_interim;
for i=1:Width
for j=1:Length
BIG_close(i+1,j+1)=img_close_interim(i,j);%扩大图像
end
end
for i=2:Width+1
for j=2:Length+1
for m =-1:1
for n =-1:1
if (BIG_close(i+m,j+n)&CORE(2+m,2+n) )==1
CORE_count_num=CORE_count_num+1;
end
end
end
if CORE_count_num<CORE_num
img_close(i-1,j-1)=0;%不符合条件,被腐蚀掉
end
CORE_count_num=0;
end
end
自编写与matlab自带 效果比较
文章来源:https://www.toymoban.com/news/detail-447450.html
到了这里,关于matlab自己编写代码实现二值图像‘腐蚀与膨胀’的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!