图像的膨胀与腐蚀

您所在的位置:网站首页 膨胀操作原理图解 图像的膨胀与腐蚀

图像的膨胀与腐蚀

2024-05-28 09:35| 来源: 网络整理| 查看: 265

原理:在特殊领域运算形式——结构元素(Sturcture Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。

结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小还很多。二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的邻域像素在进行膨胀或腐蚀操作时是否需要参与计算。

基本符号和关系:

元素:设有一幅图象X,若点a在X的区域以内,则称a为X的元素,记作a∈X。B包含于X:设有两幅图象B,X。对于B中所有的元素ai,都有ai∈X,则称B包含于(included in)X,记作B  X。B击中X:设有两幅图象B,X。若存在这样一个点,它即是B的元素,又是X的元素,则称B击中(hit)X,记作B↑X。B不击中X:设有两幅图象B,X。若不存在任何一个点,它即是B的元素,又是X的元素,即B和X的交集是空,则称B不击中(miss)X,记作B∩X=Ф;其中∩是集合运算相交的符号,Ф表示空集。补集:设有一幅图象X,所有X区域以外的点构成的集合称为X的补集,记作Xc,显然,如果B∩X=Ф,则B在X的补集内,即B  Xc。结构元素:设有两幅图象B,X。若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。结构元素通常都是一些比较小的图象。对称集:设有一幅图象B,将B中所有元素的坐标取反,即令(x,y)变成(-x,-y),所有这些点构成的新的集合称为B的对称集,记作Bv。平移:设有一幅图象B,有一个点a(x0,y0),将B平移a后的结果是,把B中所有元素的横坐标加x0,纵坐标加y0,即令(x,y)变成(x+x0,y+y0),所有这些点构成的新的集合称为B的平移,记作Ba。

腐蚀:

        把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。如下图所示。

                     这里写图片描述           ​​​​

其中X是被处理的对象,B是结构元素。对于任意一个在阴影部分的点a,Ba 包含于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之内,且比X小,就象X被剥掉了一层似的。

膨胀:

        膨胀(dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做X被B膨胀的结果。如下图所示。

                  这里写图片描述

其中X是被处理的对象,B是结构元素,不难知道,对于任意一个在阴影部分的点a,Ba击中X,所以X被B膨胀的结果就是那个阴影部分。阴影部分包括X的所有范围,就象X膨胀了一圈似的。

膨胀和腐蚀为相反的一对操作。dilate (膨胀) erode(腐蚀)都是形态学的滤波。

腐蚀、膨胀的工作原理:

这里写图片描述

这里写图片描述

OpenCV与C++的具体实现:

膨胀与腐蚀是数学形态学在图像处理中最基础的操作。图像的膨胀与腐蚀其实也是一种类似的卷积操作。其卷积操作非常简单,对于图像的每个像素,取其一定的邻域,计算最大值/最小值作为新图像对应像素位置的像素值。其中,取最大值就是膨胀,取最小值就是腐蚀。

膨胀——OpenCV实现:

在OpenCV中实现了图像膨胀的函数dilate(),可以直接调用。

Mat img = imread(imagename, IMREAD_GRAYSCALE); if (img.empty()) { fprintf(stderr, "Can not load image %s\n", imagename); return -1; } //OpenCV方法 Mat dilated_cv; dilate(img, dilated_cv, Mat());

dilate()函数第一个参数表示输入影像,第二个参数表示输出影像,第三个表示一个默认的核,在3X3的范围内寻找最大值。

膨胀——C/C++实现:

在一般的图像处理时,图像读写是由专门的组件进行读取的。这这里仍然使用OpenCV进行读取,以免增加复杂性。而在CV::Mat类中,提供了at()函数访问某一行某一列的像素值,可以通过at()函数去访问每一个像素的领域。

与之前OpenCV实现的一样,对于每一个像素,遍历以其像素位置为中心的3X3邻域,取最大值作为新图像对应位置的像素值。其具体实现如下。

//从文件中读取成灰度图像 const char* imagename = "D:\\Data\\imgDemo\\lena.jpg"; Mat img = imread(imagename, IMREAD_GRAYSCALE); if (img.empty()) { fprintf(stderr, "Can not load image %s\n", imagename); return -1; } //自定义方法 Mat dilated_my; dilated_my.create(img.rows, img.cols, CV_8UC1); for (int i = 0; i < img.rows; ++i) { for (int j = 0; j < img.cols; ++j) { //uchar minV = 255; uchar maxV = 0; //遍历周围最大像素值 for (int yi = i-1; yi


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3