• 我是将 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

膨胀

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自带 效果比较