二值形态学——腐蚀与膨胀 及 C语言代码实现

参考文献:数字图像处理(第三版) 何东健 西安电子科技大学出版社

二值形态学中的运算对象是集合, 但实际运算中, 当涉及两个集合时并不把它们看作是互相对等的。 一般设A为图像集合, S为结构元素, 数学形态学运算是用S对A进行操作。 结构元素本身也是一个图像集合, 不过通常其尺寸要比目标图像小得多。 对结构元素可指定一个原点, 将其作为结构元素参与形态学运算的参考点。 原点可包含在结构元素中, 也可不包含在结构元素中, 但运算的结果常不相同。 以下用黑点代表值为1的区域, 白点代表值为0的区域, 运算对于值为1的区域进行。

1.腐蚀

  腐蚀是一种最基本的数学形态学运算。 对给定的目标图像X和结构元素S, 将S在图像上移动, 则在每一个当前位置x, S+x只有3种可能的状态, 如下图所示:

           

第(1)种情形说明S+x与X相关;

第(2)种情形说明S+x与X不相关;

第(3)种情形说明S+x与X只是部分相关。

因而满足(1)式的点x的全体元素,称该点集为S对X的腐蚀(简称腐蚀, 也称X用S腐蚀),记为

腐蚀也可以用集合的方式定义:

该式表明, X用S腐蚀的结果是所有使S平移x后仍在X中的x的集合。 换句话说, 用S来腐蚀X得到的集合是S完全包含在X中时S的原点位置的集合。  

  腐蚀在数学形态学运算中的作用是消除物体边界点、 去除小于结构元素的物体、 清除两个物体间的细小连通等。 如果结构元素取3×3的像素块, 腐蚀将使物体的边界沿周边减少1个像素。

“腐蚀”图解:(腐蚀将图像(区域)缩小了)

代码实现:

【注】二值腐蚀基本运算,背景为黑色,目标为白色。

 1 //二值腐蚀
 2 /*函数参数:
 3     a——待腐蚀的图像
 4     b——腐蚀后的结果
 5     mat[5][5]——结构元素,我这里默认设了5*5的大小
 6 */
 7 void Bi_Corrosion(Mat &a, Mat &b, int mat[5][5])
 8 {
 9     int i, j, k, o;
10     int rows = a.rows;
11     int cols = a.cols*a.channels();
12
13     bool flag;
14
15     uchar *dst = b.data;
16     uchar *src = a.data;
17     //针对图像中每一个像素位置,判断是否结构元素能填入目标内部
18     for(i = 2; i < rows-2; i++) {
19         for(j = 2; j < cols-2; j++) {
20             //判断结构元素是否可以在当前点填入目标内部,1为可以,0为不可以
21             flag = 1;
22             for(k = -2; k <= 2 && flag; k++) {
23                 for(o = -2; o <= 2; o++) {
24                     //如果当前结构元素位置为1,判断与对应图像上的像素点是否为非0
25                     if(mat[k+2][o+2]) {
26                         //如果图像当前像素为0,则没有击中该点,不是腐蚀的输出
27                         if(!*(src+(i+k)*cols+j+o)){
28                             flag = 0;    break;
29                         }
30                     }
31                 }
32             }
33             *(dst+i*cols+j) = flag ? 255 : 0;
34         }
35     }
36 }

2.膨胀

  腐蚀可以看作是将图像X中每一个与结构元素S全等的子集S+x收缩为点x。 反之, 也可以将X中的每一个点x扩大为S+x, 即膨胀运算, 记为。用集合语言定义膨胀运算的定义形式为:

图示:

【注意】来看下特殊情况: 用B膨胀后,结果向左平移了;而用B图像的反射膨胀后位置不变。

        

  

对于非对称结构S,膨胀后会使得原图错移,但膨胀不会,总的位置和形状不变,因此膨胀公式也可以写做:

对集合X的膨胀也可以看做是对集合X补集的腐蚀的补集具有对偶特性

腐蚀和膨胀运算与集合运算的关系如下:

代码实现:

【注】二值膨胀基本运算,背景为黑色,目标为白色。

 1 //二值膨胀
 2 /*函数参数:
 3     a——待腐蚀的图像
 4     b——腐蚀后的结果
 5     mat——结构元素
 6 */
 7 void Bi_Expansion(Mat &a, Mat &b, int mat[5][5]) {
 8     int i, j, k, o;
 9     int rows = a.rows;
10     int cols = a.cols*a.channels();
11     Mat tmp = a.clone();
12     uchar* src = tmp.data;
13     //膨胀是对图像中目标补集的腐蚀,因此先求输入图像数据的补集
14     for(i = 0; i < rows; i++)
15         for(j = 0; j < cols; j++)
16             *(src+i*cols+j) = 255 - *(src+i*cols+j);
17     //膨胀是结构元素的对称集对补集的腐蚀,此处求其反射
18     for(i = 0; i < 5; i++)
19         for(j = 0; j <= i; j++)
20             mat[i][j] = mat[j][i];
21     bool flag;
22     uchar* dst = b.data;
23     //针对图像中每一个像素位置,判断是否结构元素能填入目标内部
24     for(i = 2; i < rows-2; i++) {
25         for(j = 2; j < cols-2; j++) {
26             //判断结构元素是否可以在当前点填入目标内部,1为可以,0为不可以
27             flag = 1;
28             for(k = -2; k <= 2 && flag; k++) {
29                 for(o = -2; o <= 2; o++) {
30                     //如果当前结构元素位置为1,判断与对应图像上的像素点是否为非0
31                     if(mat[k+2][o+2]) {
32                         if(!*(src+(i+k)*cols+j+o)){//没击中
33                             flag = 0;    break;
34                         }
35                     }
36                 }
37             }
38             *(dst+i*cols+j) = flag ? 255 : 0;
39         }
40     }
41     //用结构元素对称集对目标补集腐蚀后,还要对结构再求一次补集,才是膨胀结构输出
42     //赋值结构元素腐蚀漏掉的区域,使原图像恢复为二值图像
43     for(i = 0; i < rows; i++) {
44         for(j = 0; j < cols; j++) {
45             *(dst+i*cols+j) = 255 - *(dst+i*cols+j);
46             if(*(dst+i*cols+j) != 255 && *(dst+i*cols+j) != 0)
47                 *(dst+i*cols+j) = 0;
48         }
49     }
50 }

原文地址:https://www.cnblogs.com/GraceSkyer/p/8697904.html

时间: 2024-10-13 05:39:43

二值形态学——腐蚀与膨胀 及 C语言代码实现的相关文章

图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

一.RGB RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值.RGB图像仅仅使用三种颜色,R(red).G(green).B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色. 在电脑中,RGB的所谓"多少"就是指亮度,并使用整数来表示.通常情况下,RGB各有256级亮度,用数字表示为从0.1.2...直到255. 二.ARGB 一种色彩模式,也就是RGB色彩模式附加上Alpha(透

图像的腐蚀与膨胀

数字图像处理中的形态学 转自:http://blog.csdn.net/sunny3106/archive/2007/08/15/1745485.aspx (摘自某文献,因为贴图的数目有限制,后面的公式图片没有能够上,电脑重装后文档已经找不到了,囧) 一    引言        数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具.数学形态学的历史可回溯到19世纪.1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了基于

形态学滤波:(1)腐蚀与膨胀 (2)开运算,闭运算,形态学梯度,顶帽,黑帽

一.形态学概述 图像处理中的形态学一般指的是数学形态学. 数学形态学是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论.其基本运算包括:二值腐蚀和膨胀,二值开闭运算,骨架抽取,极限腐蚀,击中击不中变换,形态学梯度,top-hat变换,颗粒分析,流域变换,灰值腐蚀和膨胀,灰值开闭运算,灰值形态学梯度等. 简单来讲,形态学操作就是基于形状的一系列图像处理操作. 二.形态学滤波 (1)腐蚀与膨胀 膨胀和腐蚀能实现多种多样的功能,主要如下: 消除噪声: 分割(isolate)

OpenCV学习 7:图像形态学:腐蚀、膨胀

原创文章,欢迎转载,转载请注明出处 首先什么是图像形态学?额,这个抄下百度到的答案.基本思想:    用具有一定形态的结构元素去度量和提取图像中的对应形状已达到对图像分析和识别的目的,形态学图像处理表现为一种领域运算方式(这个和前面的模糊运算是一样的运算方式),效果取决于结构元素(就是前面smooth里面的核)的大小,内容以及逻辑运算的性质.看了这些定义是不是很晕,对很晕...我比较关心的是它的用途和怎么计算.    用途是:简化图像数据,保持他们基本的形状特性,并出去不相干的结构.    基本

OpenCV2:大学篇 形态学技术-腐蚀与膨胀操作

一.简介 图像处理中的形态学操作用于图像预处理操作(去噪 形状简化) 图像增强(骨架提取 细化  凸包  物体标记)  物体背景分割及物体形态量化等场景 二.腐蚀与膨胀操作 OpenCV 提供了 erode() 进行腐蚀操作 提供了 dilate() 进行膨胀操作 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.h

机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的文本str格式,loc表示文本在图中的位置,font_size可以使用cv2.FONT_HERSHEY_SIMPLEX, font_scale表示文本的规格,color表示文本颜色,linestick表示线条大小 信用卡数字识别: 信用卡      数字模板涉及到的内容:主要是采用模板匹配的思想 思

ComicEnhancerPro 系列教程十七:二值化图像去毛刺

作者:马健邮箱:[email protected] 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十七:二值化图像去毛刺 在灰度图像处理成纯黑白(二值化)图像以后,经常出现的一个问题是轮廓边缘出现毛刺.如下面这个图像: 为了看得更清楚,放大到800%并加网格线: 可以看出在"工"字的上面一横中,上边缘有几个突出点,下边缘有两个凹陷点,而在"业"字左侧竖条中有突出点,下面一横中有凹陷点. 产生毛刺的原因是

图像腐蚀、膨胀、基本原理和程序实现

图像的腐蚀与膨胀 一.原理: ⑴ 图像形态学处理的概念 数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界.骨架以及凸壳,还包括用于预处理或后处理的形态学过滤.细化和修剪等.图像形态学处理中我们感兴趣的主要是二值图像. ⑵ 二值图像的逻辑运算 逻辑运算尽管本质上很简单,但对于实现以形态学为基础额图像处理算法是一种有力的补充手段.在图像处理中用到的主要逻辑运算是:与.或和非(求补),它们可以互相组合形成其他逻辑运算. ⑶ 膨胀和腐蚀 膨胀

Opencv对图像做腐蚀和膨胀处理的结果

在数字图像处理中,图像的形态学变换占有很重要的地位.基本的形态转换就是膨胀和腐蚀,它们能实现多种功能:例如消除噪声.分割出独立的图像元素以及在图像中连接相邻的元素.当然形态学也常备用于求出图像的梯度. 一. 关键函数介绍 下面就介绍OpenCV中对图像进行二值化的关键函数 cvErode() 函数功能:对图像进行腐蚀 函数原型:void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iteratio