0.前言

  这篇文章就慢慢一边做实验一边写基本的形态学处理的内容,看着阮老师翻译的书直接用MATLAB靠自己的记忆写程序。慢慢更这篇,一边理解一边更,包括边界提取、孔洞填充(重点,因为我要考的课有道题就考这个)、骨架、连通分量、细化、裁剪等等。

1.边界提取

  表示为 β(A)\beta(A)β(A) 的集合 AAA 的边界可以先用 BBB 对 AAA 服饰,而后做 AAA 和 腐蚀结果的之间的集合之差得到,即β(A)=A−(A⊖B)\beta(A) = A - (A \ominus B)β(A)=A−(A⊖B)
我在思考边界提取和边缘提取到底有什么区别,就写了写对比了下,思考了下。
  边界:专门指外部的轮廓
  边缘:在数字图像处理中专门指灰度突变的地方
然后写了个程序对比了下,发现其实确实形态学处理起来还真有点带感。

  程序的思路是读入彩色图像,然后将彩色图转灰度图之后利用 edge 提取边缘,以及提取3个通道的分量去提取边缘,然后进行对比。
  而边界提取可以直接在彩色空间中操作,所以我用上面的公式,直接得到彩色的边界,然后在彩色边界中提取R、G、B分量,之后进行显示对比。其中结构元是 5*5 的 strucure

                        先看下面的结果吧

以前手撸过canny边缘的算法,这次用了系统自带的 edge 函数,二阶边缘,速度快、识别效率高,但是MATLAB中 edge 函数需要转换到灰度空间去做,并且最后一步连通的时候出来结果是 二值图 ,采用 rgb2gray 函数不免会有灰度损失,而直接直接提取各个分量容易造成在浮点型转化的时候的精度损失。左边的图是边缘提取的结果,是黑白二值图 ,而右边的是利用上面公式提取出来的 彩色边界 ,看到轮廓分明,神清气爽。

                      再看下面的另一个结果吧


诚如我在之前说的,利用 edge 函数需要在灰度图像进行,所以我提取R、G、B空间进行边缘提取,但是由于提取出来的灰度图每个灰度值不一样,所以容易导致了可能灰度突变的地方不一样,所以显示出的 边缘 有些不一样,而利用传统的边界提取方法的边界提取的绝对一样,仅仅只是在灰度显示有差别罢了,况且人眼还识别不出来。

1.1总结

  边缘和边界的提取有差别,并且有不同的方法,在边界提取的时候结构元的大小选择也有考究,需要再进一步思考吧!

1.2代码

%Coding = UTF8
%By neverland!
%Nov 19th
%version1.0%读入图像im = imread('test.jpg');
%操作gray_im = rgb2gray(im);         %灰度图r = im(:,:,1);                  %红g = im(:,:,2);                  %绿b = im(:,:,3);                  %蓝r_edge = edge(r,'canny');       %红边缘g_edge = edge(g,'canny');       %绿边缘b_edge = edge(b,'canny');       %蓝边缘%显示图像subplot(2,3,1);imshow(r_edge);  title('红通道canny边缘','fontsize',20);subplot(2,3,2);imshow(g_edge);  title('绿通道canny边缘','fontsize',20);subplot(2,3,3);imshow(b_edge);  title('蓝通道canny边缘','fontsize',20);%利用边界提取的方法提取str_ =  ones(5,5);             %结构元combined_edge = im - imerode(im,str_);         %边界提取%显示图像subplot(2,3,4);r_edge2 = combined_edge(:,:,1);imshow(r_edge2);title('第二种方法提红边界','fontsize',20);   subplot(2,3,5);g_edge2 = combined_edge(:,:,2);imshow(g_edge2);title('第二种方法提绿边界','fontsize',20);b_edge2 = combined_edge(:,:,3);subplot(2,3,6);imshow(b_edge2);title('第二种方法提蓝边界','fontsize',20);%开启另一个窗口对比figuregray_edge = edge(gray_im,'canny');subplot(1,2,1);imshow(gray_edge);             title('灰度图像提取边缘','fontsize',20);subplot(1,2,2);imshow(combined_edge);title('利用形态学处理提取的边界','fontsize',20);

2.孔洞填充

  孔洞是和背景相互连接的边界所包围的一个背景区域,如下面图所示,红色部分框起来的部分就是孔洞,在《数字图像处理第三版》中,处理孔洞一共有3种方法,但是在各种paper里也提出了其他的方法,其实不外乎就是基本的形态学处理、种子填充、扫描线 ,由于书上给的方法很难实现,实验的时候直接用了一个 imfill 的函数,感觉好菜,不过确实如果要知道孔洞的一个起始点,这样好费劲,还不自动。

2.1 形态学的方法

Xk=(XK−1⊕B)h∪AChhk=1,2,3,⋯X_k = (X_{K-1} \oplus B ) \phantom{h} \cup A^C \phantom{hh} k=1,2,3,\cdotsXk​=(XK−1​⊕B)h∪AChhk=1,2,3,⋯  看了看图,实际是就是用了一个结构元从孔洞的一个任意内部开始膨胀,然后再和原图像的补集求交集,因为原图像孔洞部分(挖去的一部分)的值为0,而求完补集之后就变成有值的部分了,那么和做完膨胀的图像求交集就填充了一部分孔洞,然后多做几次,直到不再变化为止。
  这种方法费时费力,需要自己先定义一个起始点,然后进行膨胀,然后和补集合求交集,最后再和原来图像求并集,才能得到想要的图。


有一个结构元是十字架,然后比如已经知道了 X0X_0X0​ 即一个孔洞的起点,用十字架去膨胀,膨胀之后和补集求交就补了一部分,持续下去,直到你认为可以为止,matlab直接使用imfill函数即可,当然如果是手撕算法的话,


就是这样吧。。。把。。。。

 %MATLAB内置的函数填充im = imread('kongdong.tif');im_ = im2bw(im);true_im = imfill(im_,'holes');subplot(1,2,1);imshow(im);subplot(1,2,2);imshow(true_im);
    %手撕算法A = imread('kongdong.tif');A = im2bw(A); %二值化A_hat = ~A; %A的补集[m,n] = size(A);X = zeros(m,n);[x,y] = find(A==1);         %任意选取A中灰度值为1的点的位置 X(x(1),y(1)) = 1; %选取第一个灰度值为1的点为初始点se = [0,1,0;1,1,1;0,1,0]; %结构元flag = 0;  %  迭代标志i = 0;    %迭代次数while(~flag)i = i + 1;Xp = X;X = imdilate(X,se) & A_hat;     %膨胀后与补集求交集if X == Xp          flag = 1;         endendA_ = ~X | A; %求并集figure(1);subplot(1,2,1);imshow(A);title('二值化后的图','fontsize',30);subplot(1,2,2);imshow(A_);
title('填充结果','fontsize',30);


比imfill好像厉害点。。
https://blog.csdn.net/LYduring/article/details/80443709
这个手撕算法的话引用的是这篇blog里的。

数字图像处理笔记(九)基本的形态学算法相关推荐

  1. 数字图像处理笔记2-nbsp;边沿检…

    原文地址:数字图像处理笔记2- 边沿检测与提取,轮廓跟踪(转)作者:小草帽 7.1 边沿检测 我们给出一个模板 和一幅图象 .不难发现原图中左边暗,右边亮,中间存在着一条明显的边界.进行模板操作后的结 ...

  2. 数字图像处理笔记-02(图像空域增强技术及联合运用)

    数字图像处理笔记-02(图像空域增强技术及联合运用) (一) 图像增强 1.1 基本概念 由于图像在传输或者处理过程中会引入噪声或使图像变模糊,从而降低了图像质量,甚至淹没了特 征,给分析带来了困难. ...

  3. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  4. Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法

    Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法 原文:Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法  [函数名称] 二值图像轮廓提取      ...

  5. 【数字图像处理matlab】(HSI变换融合算法)

    [数字图像处理matlab](HSI变换融合算法) 输入一张高分辨率的全色影像HR,一张低分辨率的多光谱影像MS,采用HSI变换融合算法实现影像融合,其中RGB与HSI影像的相互转换调用自定义函数RG ...

  6. 数字图像处理笔记(一)——图像存储空间,分辨率,图像内插

    数字图像处理笔记(一)--图像存储空间,分辨率,图像内插 本系列笔记是笔者在学习冈萨雷斯<数字图像处理>第三版时做的总结,日后看的时候方便点,如果有幸得到大家的讨论,喜上眉梢. 本节参考书 ...

  7. 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

    文章目录 一.实验目的 二.实验仪器 三.实验原理 1. 结构元素: 2. 腐蚀运算: 3. 膨胀运算: 4. 开运算: 5. 闭运算: 四.实验内容: 1. 形态学图像处理用于图像边界提取 2.数学 ...

  8. 数字图像处理笔记(一)基础内容

    基础内容 数字图像是什么,和模拟图像又有什么区别 数字图像处理 数字图像处理研究内容 数字图像处理有哪些方法 计算机图形学和数字图像处理的区别 常用的数字图像处理开发工具 数字图像 图像的数学表达 数 ...

  9. 【图像处理】数字图像处理笔记

    文章目录 直方图处理 滤波器 图像复原 形态学图像处理 灰度形态学--多使用平坦结构元(SE)[数字图像处理P428 图像分割 1.canny边缘检测[数字图像处理P463] 图像的表征 特征描述子 ...

  10. Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法

    原文:Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法  [函数名称] 部分彩色保留函数       WriteableBitmap PartialcolorProcess(W ...

最新文章

  1. 3D Detection 论文汇总
  2. msvc 编译路径_Colmap编译教程
  3. Java程序员从笨鸟到菜鸟之(八)反射和代理机制
  4. mycat配置访问oracle_教程 | MySql都会了,确定不学习一下MyCat分片?
  5. 顺利搭建了oracle
  6. common lisp 学习第二天 简单数据库操作
  7. setyear java_如何在Java中创建不可变类
  8. SAP License:把握好集成测试大关,ERP就成功了一大半
  9. 我用Python采集了班花的空间数据集,除了美照竟然再一次发现了她另外的秘密!
  10. 二分查找向上还是向下取整_113、股市中的跳空缺口判断技巧是向上还是向下
  11. php 图像居中裁剪函数,PHP 实现的自定义图像居中裁剪函数示例
  12. c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码
  13. 监控显示服务器超时,监控连接服务器超时怎么解决
  14. 语义分割之《CCNet: Criss-Cross Attention for Semantic Segmentation》论文阅读笔记
  15. 导致 Scan VIP 和 Scan Listener(监听程序)出现故障的最常见的 5 个问题 (文档 ID 1602038.1)
  16. 【免费抢票】6月9日杭州,产品经理会议
  17. java算法——通过身份证号获取出生的年月日
  18. 事件回放:因「鹿晗、关晓彤」公布恋情,微博瘫痪了……
  19. 《小窗幽记》全文 陈继儒
  20. 主从模式的数据库搭建(主从复制)

热门文章

  1. 如何修改背景色?证件照背景颜色怎样换成白色?
  2. 实战1--航空公司客户价值分析(画图篇)
  3. linux环境使用c语言获取系统时间,并拼接成字符串
  4. Windows Installer服务总是自动关闭导致无法安装在win10上安装英伟达显卡驱动的解决方案...
  5. 杭州电子科技大学计算机调剂,2019年杭州电子科技大学硕士研究生调剂公告
  6. 计算机DSU,研科d5000dsu驱动
  7. android app 设计,安卓APP新手设计教程:19条Android设计经验大全
  8. error: invalid operands of types ‘QLabel*‘ and ‘void‘ to binary ‘operator>
  9. 怎么用命令提示符测试软件网速,cmd指令测试网速技巧
  10. 您需要计算机管理员提供的权限才能更改,您需要管理员权限才能删除此文件夹...