• 数字图像处理之matlab实验(五):形态学图像处理


    常见的形态学处理包括腐蚀、膨胀、开运算、闭运算。不同的操作有不同的作用,同样的操作在不同类型的图片上也有不同效果,具体效果如下表格所示。要求熟练掌握对二值图像的形态学处理。

    不同操作对不同类型图像处理效果

    一、对二值图像进行处理

    1、结构元素

    在开始形态学操作之前,要准备好结构元素,通常结构元素是凸的,并且有一个参考点。

     我们会将结构元素的参考点滑过待处理图像的每一个像素,并考虑此时结构元素和图像区域的关系。下面定义一个结构元素,结构元素的图片效果、数值展示如下图:

    1. SE = strel('diamond',3);
    2. GN=getnhood(SE)%获取结构元素的邻域
    3. figure,imshow(GN,[]);

    2、腐蚀

    腐蚀的作用是标记原图像中结构元素出现的位置,标记的位置为参考点所在的位置。

    1. Image=imread('menu.bmp'); %打开图像
    2. BW=im2bw(Image); %转换为二值图像
    3. subplot(131),imshow(BW);title('原图像');
    4. [h w]=size(BW); %获取图像尺寸
    5. result=ones(h,w); %定义输出图像,初始化为1
    6. for x=2:w-1
    7. for y=2:h-1 %扫描图像每一点,即结构元素移动到每一个位置
    8. for m=-1:1
    9. for n=-1:1 %当前点周围3×3范围,即3×3结构元素所覆盖范围
    10. if BW(y+n,x+m)==0 %该范围内有像素点为0,即该位置不能完全包含结构元素
    11. result(y,x)=0; %将参考点记录为背景点,即腐蚀掉
    12. break;
    13. end
    14. end
    15. end
    16. end
    17. end
    18. subplot(132),imshow(result); title('自编程实现二值图像腐蚀');
    19. SE=strel('square',3); %创建结构元素
    20. result=imerode(BW,SE); %腐蚀运算
    21. subplot(133),imshow(result); title('二值图像imerode');

    3、膨胀

    膨胀,具有让二值图像视觉加粗的效果,膨胀的方向,取决于结构元素,以下图结构元素为例,结构元素的参考点上下分别有两个像素,那么作用在这个结构元素的原图像会在上下两个方向膨胀两个像素。

    1. Image=imread('menu.bmp'); %打开图像
    2. BW=im2bw(Image); %转换为二值图像
    3. subplot(131),imshow(BW),title('显示原图像');
    4. [h w]=size(BW); %获取图像尺寸
    5. result=zeros(h,w); %定义输出图像,初始化为0
    6. for x=2:w-1
    7. for y=2:h-1 %扫描图像每一点,即结构元素移动到每一个位置
    8. for m=-1:1
    9. for n=-1:1 %当前点周围3×3范围,即结构元素为3×3大小
    10. if BW(y+n,x+m) %结构元素所覆盖3×3范围内有像素点为1,即交集不为空
    11. result(y,x)=1; %将参考点记录为前景点
    12. break;
    13. end
    14. end
    15. end
    16. end
    17. end
    18. subplot(132),imshow(result);title('自定义实现二值图像膨胀');
    19. SE=strel('square',3); %创建结构元素
    20. result1=imdilate(BW,SE); %膨胀运算
    21. subplot(133),imshow(result1);title('imdilate实现二值图像膨胀');

    4、开运算和闭运算

    开运算是用同一个结构元素对原图像先腐蚀后膨胀,常见应用是,消除感兴趣目标外部孤立的噪声点和细长的毛刺(尺寸都要比结构元素小)。

    闭运算是用同一个结构元素对原图像先膨胀后腐蚀,常见应用是,消除感兴趣目标内部的孔洞。

    1. Image=imread('A.bmp');
    2. BW=im2bw(Image);
    3. SE=strel('square',3);
    4. result1=imdilate(imerode(BW,SE),SE);
    5. result2=imopen(BW,SE); %用3×3结构元素进行开运算
    6. figure,imshow(result1);title('开运算方法1');
    7. figure,imshow(result2);title('开运算方法2');
    8. result3=imerode(imdilate(BW,SE),SE);
    9. result4=imclose(BW,SE); %用3×3结构元素进行闭运算
    10. figure,imshow(result3);title('闭运算方法1');
    11. figure,imshow(result4);title('闭运算方法2');

    5、形态学滤波

    顾名思义,从图像中提取固定形状的原图像内容,提取的形状和结构元素的形状一致,这里用开运算实现,先进行腐蚀后进行膨胀,腐蚀时的结构元素尺寸需要大于不想要的形状,小于想要保留的形状尺寸;这样的腐蚀之后就能保证,只留下了感兴趣的目标形状,这样再膨胀一次就能恢复到初始形状的大小。

    1. Image=imread('pattern.jpg');
    2. Th=graythresh(Image);
    3. OriginBW=im2bw(Image,Th);
    4. subplot(131);imshow(OriginBW);title('原始二值图像');
    5. imwrite(OriginBW,'pattern1.bmp');
    6. BW1=1-OriginBW;
    7. se=strel('square',3);%结构元素为边长为3的正方形
    8. BW2=1-imopen(BW1,se);
    9. subplot(132);imshow(BW2);title('矩形块提取');
    10. imwrite(BW2,'rectang1.bmp');
    11. se45=strel('line',25,45);%结构元素为角度为45的线,长度为25个像素
    12. BW3=1-imopen(BW1,se45);
    13. subplot(133);imshow(BW3);title('线段提取');
    14. imwrite(BW3,'line1.bmp');

    6、平滑处理

    通过先开运算后闭运算的操作,去除目标图像内部和外部的噪声。

    1. Image=imread('A.bmp');
    2. BW=im2bw(Image);
    3. subplot(131);imshow(BW);title('原图像');
    4. SE=strel('square',4);
    5. result1=imclose(imopen(BW,SE),SE); %用3×3结构元素先开后闭
    6. subplot(132);imshow(result1);title('先开后闭');
    7. result2=imopen(imclose(BW,SE),SE); %先闭后开
    8. subplot(133);imshow(result2);title('先闭后开');

    7、击中与不击中 

    这个有点目标检测的意思,不仅需要内部形状满足结构元素,也需要外部形状满足结构元素,处理结果标记的是查找到的符合要求的位置。

    1. Image=zeros(12,12); %定义目标图像Image
    2. Image(2:6,3:5)=1;
    3. Image(9:11,4:6)=1;
    4. Image(3:5,8:10)=1;
    5. Image(8:9,9:10)=1;
    6. Image(2,10)=1;
    7. Image(3,11)=1;
    8. SE1=[0 0 0 0 0 %定义结构元素SE1
    9. 0 1 1 1 0
    10. 0 1 1 1 0
    11. 0 1 1 1 0
    12. 0 0 0 0 0];
    13. SE2=[1 1 1 1 1 %定义结构元素SE2
    14. 1 0 0 0 1
    15. 1 0 0 0 1
    16. 1 0 0 0 1
    17. 1 1 1 1 1];
    18. subplot(121),imshow(Image); title('原图像');
    19. result1=imerode(Image,SE1); %结构元素SE1探测图像内部,结果为result1
    20. Image1=~Image; %目标图像Image求补
    21. result2=imerode(Image1,SE2); %结构元素SE2检测图像外部,结果为result2
    22. result=result1 & result2; %求出击中与否变换的结果result
    23. subplot(122),imshow(result); title('击中与否变换结果');

    二、对灰度图进行处理

    1、腐蚀和膨胀

    对灰度图腐蚀后,图像整体变暗,亮细节被削弱;对灰度图膨胀后,图像整体变亮,暗细节被削弱;总之,经过腐蚀膨胀处理后,图像会变模糊;对彩色图像膨胀腐蚀处理后,是不是有一种油画的效果呢~

    1. Image=(imread('maleman.gif'));
    2. se=strel('ball',5,5);%选取球形结构元素
    3. result1=imdilate(Image,se);%膨胀灰度图像
    4. result2=imerode(Image,se); %腐蚀灰度图像
    5. imshow(Image);title('原始灰度图像');
    6. figure,imshow(result1);title('膨胀后的图像');
    7. figure,imshow(result2);title('腐蚀后的图像');
    8. imwrite(result1,'ym1.bmp');
    9. imwrite(result2,'ym2.bmp');

  • 相关阅读:
    涿州8500亩 国稻种芯·中国水稻节:河北保定百尺竿镇名片
    【洛谷算法题】P5708-三角形面积【入门1顺序结构】
    使用DESeq2进行转录组原始count标准化和差异分析
    这些比较前沿的设计网站,你知道吗?
    大功率电源的应用场景有哪些(高压功率放大器)
    一波未平一波又起,VMware发现一高危漏洞
    <html dir=ltr>是什么意思?
    面向千兆宽带网络业务应用的高质量用户体验研究
    GBase 8c 角色属性
    插入一百万数据的最优解分析和耗时
  • 原文地址:https://blog.csdn.net/u014655960/article/details/127553896