您的当前位置:首页Javascript图像处理—图像形态学(膨胀与腐蚀)_javascript技巧
广告

Javascript图像处理—图像形态学(膨胀与腐蚀)_javascript技巧

2023-12-03 来源:六三科技网

前言

上一篇文章,我们讲解了图像处理中的阈值函数,这一篇文章我们来做膨胀和腐蚀函数。

膨胀与腐蚀

说概念可能很难解释,我们来看图,首先是原图:

Original image

膨胀以后会变成这样:

Dilation result - Theory example

腐蚀以后则会变成这样:

Erosion result - Theory example

看起来可能有些莫名其妙,明明是膨胀,为什么字反而变细了,而明明是腐蚀,为什么字反而变粗了。

实际上,所谓膨胀应该指:

较亮色块膨胀。

而所谓腐蚀应该指:

较亮色块腐蚀。

上面图里面,由于背景白色是较亮色块,所以膨胀时就把黑色较暗色块的字压扁了……相反腐蚀时,字就吸水膨胀了……

用数学公式表示就是:

说白了就是在指定大小的内核里找最暗或者最亮的像素点,并用该点替换掉内核锚点上的像素。

实现

首先我们来实现膨胀dilate函数。 代码如下:var dilate = function(__src, __size, __borderType, __dst){ __src || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */); if(__src.type && __src.type == "CV_RGBA"){ var width = __src.col, height = __src.row, size = __size || 3, dst = __dst || new Mat(height, width, CV_RGBA), dstData = dst.data; var start = size >> 1; var withBorderMat = copyMakeBorder(__src, start, start, 0, 0, __borderType), mData = withBorderMat.data, mWidth = withBorderMat.col; var newOffset, total, nowX, offsetY, offsetI, nowOffset, i, j; if(size & 1 === 0){ error(arguments.callee, UNSPPORT_SIZE/* {line} */); return __src; } for(i = height; i--;){ offsetI = i * width; for(j = width; j--;){ newOffset = 0; total = 0; for(y = size; y--;){ offsetY = (y + i) * mWidth * 4; for(x = size; x--;){ nowX = (x + j) * 4; nowOffset = offsetY + nowX; (mData[nowOffset] + mData[nowOffset + 1] + mData[nowOffset + 2] > total) && (total = mData[nowOffset] + mData[nowOffset + 1] + mData[nowOffset + 2]) && (newOffset = nowOffset); } } dstData[(j + offsetI) * 4] = mData[newOffset]; dstData[(j + offsetI) * 4 + 1] = mData[newOffset + 1]; dstData[(j + offsetI) * 4 + 2] = mData[newOffset + 2]; dstData[(j + offsetI) * 4 + 3] = mData[newOffset + 3]; } } }else{ error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); } return dst; };这行代码里面,我们先用RGB的数值和与上一个最大值total对比,然后如果新的值比较大,就把新的值赋给total,并把新的偏移量newOffset赋值当前偏移量nowOffset。

然后整个内核大小的面积循环完了就可以找到一个最大的total以及对应的偏移量newOffset。就可以赋值了:

dstData[(j + offsetI) * 4] = mData[newOffset];dstData[(j + offsetI) * 4 + 1] = mData[newOffset + 1];dstData[(j + offsetI) * 4 + 2] = mData[newOffset + 2];dstData[(j + offsetI) * 4 + 3] = mData[newOffset + 3];

那么腐蚀erode函数则相反,找一个最小的值就行了。 代码如下:var erode = function(__src, __size, __borderType, __dst){ __src || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */); if(__src.type && __src.type == "CV_RGBA"){ var width = __src.col, height = __src.row, size = __size || 3, dst = __dst || new Mat(height, width, CV_RGBA), dstData = dst.data; var start = size >> 1; var withBorderMat = copyMakeBorder(__src, start, start, 0, 0, __borderType), mData = withBorderMat.data, mWidth = withBorderMat.col; var newOffset, total, nowX, offsetY, offsetI, nowOffset, i, j; if(size & 1 === 0){ error(arguments.callee, UNSPPORT_SIZE/* {line} */); return __src; } for(i = height; i--;){ offsetI = i * width; for(j = width; j--;){ newOffset = 0; total = 765; for(y = size; y--;){ offsetY = (y + i) * mWidth * 4; for(x = size; x--;){ nowX = (x + j) * 4; nowOffset = offsetY + nowX; (mData[nowOffset] + mData[nowOffset + 1] + mData[nowOffset + 2] < total) && (total = mData[nowOffset] + mData[nowOffset + 1] + mData[nowOffset + 2]) && (newOffset = nowOffset); } } dstData[(j + offsetI) * 4] = mData[newOffset]; dstData[(j + offsetI) * 4 + 1] = mData[newOffset + 1]; dstData[(j + offsetI) * 4 + 2] = mData[newOffset + 2]; dstData[(j + offsetI) * 4 + 3] = mData[newOffset + 3]; } } }else{ error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); } return dst; };效果

小编还为您整理了以下内容,可能对您也有帮助:

图像处理中的腐蚀与膨胀是什么意思?

图像处理分为多种,对于不同的图像腐蚀和膨胀的定义不同。

1、形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算;先腐蚀后膨胀的过程称为开运算。

它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。

2、对灰度图像的膨胀(或腐蚀)操作有两类效果:

(1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);

(2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。

腐蚀就是使用算法,将图像的边缘腐蚀掉。作用就是将目标的边缘的“毛刺”踢除掉。

膨胀就是使用算法,将图像的边缘扩大些。作用就是将目标的边缘或者是内部的坑填掉。

使用相同次数的腐蚀与膨胀,可以使目标表面更平滑。

扩展资料:

1、图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理。

目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。

2、图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。

压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。

3、图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。

如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像

参考资料来源:百度百科-图像处理

形态学操作-腐蚀与膨胀

1.形态学操作

形态学操作就是基于形状的一系列图像处理操作。一般情况下对二值化的图像进行操作。腐蚀与膨胀是最基本的形态学操作

应用:

(1)消除噪声

(2)分割(isolate)的图像元素,以及连接(join)相邻的元素

(3)寻找图像中的明显的极大值区域或者极小值区域

2.膨胀(最大值dilate)

此操作是将图像A与任意形状(通常为正方形或圆形)的内核B,,进行卷积。

内核B有一个可定义的 锚点, 通常定义为内核中心点。

进行膨胀操作时,将内核B划过图像,将内核B覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )

src——输入图像.

dst——输出图像.

element——用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素

iterations——膨胀的次数

3.腐蚀(erode)

腐蚀提取的是内核覆盖下的相素最小值。进行腐蚀操作时,将内核B划过图像,将内核B覆盖区域的最小相素值提取,并代替锚点位置的相素。

src——输入图像.

dst——输出图像.

element——用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素

iterations——腐蚀的次数

4.结构元素

我们一般使用函数 getStructuringElement配合膨胀或腐蚀算法使用

Mat strElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3), new Point(-1, -1));

其中有三种内核形状可以选择:

矩形: MORPH_RECT

交叉形: MORPH_CROSS

椭圆形: MORPH_ELLIPSE

再指定内核大小,以及锚点位置。不指定锚点位置,则默认锚点在内核中心位置。

5.图像的开运算

开运算:先腐蚀后膨胀,移除小的对象时候很有用

6.图像的闭运算

闭运算:先膨胀后腐蚀,被用来填充前景物体中的小洞,或者抹去前景物体上的小黑点

7.梯度:膨胀与腐蚀图之差

可以用来突出边缘,可以保留物体的边缘轮廓

8.顶帽:原图与开运算结果之差

开运算放大了裂缝或者局部低亮度的区域,所以,从原图中减去开运算后的图,得到的结果突出了比原图轮廓周围的区域更明亮的区域,这个操作与选择的核的大小有关。TopHat运算一般用来分离比邻近点亮一些的斑块,可以使用这个运算提取背景

9.黑帽运算:闭运算的结果与原图之差

黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

参考: https://www.jianshu.com/p/6147d69c879f

形态学操作—膨胀与腐蚀(Dilation and Erosion)

膨胀和腐蚀被称为形态学操作。它们通常在二进制图像上执行,类似于轮廓检测。通过将像素添加到该图像中的对象的感知边界,扩张放大图像中的明亮白色区域。侵蚀恰恰相反:它沿着物体边界移除像素并缩小物体的大小。

通常这两个操作是按顺序执行的,以增强重要的对象特征!

如上所述,这些操作通常组合在一起以获得理想的结果!一种这样的组合称为Opening,其是侵蚀,然后是膨胀

这在降噪中是有用的,其中侵蚀首先消除噪声(并收缩物体)然后扩张再次扩大物体,但噪声将从先前的侵蚀中消失!

为了在OpenCV中实现这一点,我们将函数morphologyEx与原始图像,我们想要执行的操作以及传入的内核一起使用。

Closing 是Opening的反向组合,它是膨胀,然后是侵蚀。这对于关闭物体内的小孔或暗区很有用

它可用于关闭前景对象内的小孔或对象上的小黑点。

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

图像膨胀腐蚀算法原理

膨胀和腐蚀的主要用途:
消除噪声;
分割出独立的图像元素,在图像中连接相邻的元素;
寻找图像中明显的极大值或极小值区;
求出图像的梯度;
【注】:
腐蚀和膨胀是对像素值大的部分而言的,即高亮白部分而不是黑色部分;
膨胀是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域;
腐蚀是图像中的高亮部分被腐蚀掉,领域缩减,效果图拥有比原图更小的高亮区域;
2
/9
膨胀原理:
膨胀:求局部最大值;
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最大值;
③将这个最大值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐增长。
3
/9
腐蚀原理:
腐蚀:局部最小值(与膨胀相反);
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值;
③将这个最小值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐减小。
4
/9
OpenCV中膨胀函数-dilate()
格式:
void dilate(
InputArray src,//输入
OutputArray dst, //输出
InputArray kernel, //核大小
Point anchor=Point(-1,-1),// 锚位置,(-1,-1)为中心
int iterations=1, //迭代次数
int borderType=BORDER_CONSTANT,//图像边界像素模式
const Scalar& borderValue=morphologyDefaultBorderValue()//边界值
)
【注】:
关于核,一般配合getStructuringElement()使用;
getStructuringElement():返回指定形状和尺寸的结构元素;
格式:
getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));
参数:
shape:表核的形状,矩形MORPH_RECT;交叉形MORPH_CROSS;椭圆形MORPH_ELLIPSE;
ksize:核尺寸大小;
anchor:锚点的位置,锚点只影响形态*算结果的偏移;
5
/9
OpenCV中腐蚀函数-erode()
格式:
void erode(
InputArray src,//输入
OutputArray dst, //输出
InputArray kernel, //核大小
Point anchor=Point(-1,-1),// 锚位置,(-1,-1)为中心
int iterations=1, //迭代次数
int borderType=BORDER_CONSTANT,//图像边界像素模式
const Scalar& borderValue=morphologyDefaultBorderValue()//边界值
)
6
/9
形态学开运算:
开运算(Open Operation):先腐蚀后膨胀的过程;
功能:
消除小物体;
在纤细处分离物体;
平滑较大的边界并不明显改变其面积;
7
/9
形态学闭运算:
闭运算(Closing Openration),先膨胀后腐蚀;
功能:
排除小型黑洞(黑斑);
8
/9
OpenCV:morphologyEx()
功能:morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,
如开闭运算,形态学梯度,“顶帽”、“黑帽”等等。

图像膨胀腐蚀算法原理

膨胀和腐蚀的主要用途:
消除噪声;
分割出独立的图像元素,在图像中连接相邻的元素;
寻找图像中明显的极大值或极小值区;
求出图像的梯度;
【注】:
腐蚀和膨胀是对像素值大的部分而言的,即高亮白部分而不是黑色部分;
膨胀是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域;
腐蚀是图像中的高亮部分被腐蚀掉,领域缩减,效果图拥有比原图更小的高亮区域;
2
/9
膨胀原理:
膨胀:求局部最大值;
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最大值;
③将这个最大值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐增长。
3
/9
腐蚀原理:
腐蚀:局部最小值(与膨胀相反);
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值;
③将这个最小值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐减小。
4
/9
OpenCV中膨胀函数-dilate()
格式:
void dilate(
InputArray src,//输入
OutputArray dst, //输出
InputArray kernel, //核大小
Point anchor=Point(-1,-1),// 锚位置,(-1,-1)为中心
int iterations=1, //迭代次数
int borderType=BORDER_CONSTANT,//图像边界像素模式
const Scalar& borderValue=morphologyDefaultBorderValue()//边界值
)
【注】:
关于核,一般配合getStructuringElement()使用;
getStructuringElement():返回指定形状和尺寸的结构元素;
格式:
getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));
参数:
shape:表核的形状,矩形MORPH_RECT;交叉形MORPH_CROSS;椭圆形MORPH_ELLIPSE;
ksize:核尺寸大小;
anchor:锚点的位置,锚点只影响形态*算结果的偏移;
5
/9
OpenCV中腐蚀函数-erode()
格式:
void erode(
InputArray src,//输入
OutputArray dst, //输出
InputArray kernel, //核大小
Point anchor=Point(-1,-1),// 锚位置,(-1,-1)为中心
int iterations=1, //迭代次数
int borderType=BORDER_CONSTANT,//图像边界像素模式
const Scalar& borderValue=morphologyDefaultBorderValue()//边界值
)
6
/9
形态学开运算:
开运算(Open Operation):先腐蚀后膨胀的过程;
功能:
消除小物体;
在纤细处分离物体;
平滑较大的边界并不明显改变其面积;
7
/9
形态学闭运算:
闭运算(Closing Openration),先膨胀后腐蚀;
功能:
排除小型黑洞(黑斑);
8
/9
OpenCV:morphologyEx()
功能:morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,
如开闭运算,形态学梯度,“顶帽”、“黑帽”等等。

图像开运算和闭运算

如果您觉得本文不错,帮忙点赞哦!

一. 图像形态学处理 —— 膨胀和腐蚀

二. 开运算与闭运算:

    开运算:先腐蚀后膨胀,能够消除图像区域外的小白点(噪声)。

    闭运算:先膨胀后腐蚀,能够消除图像区域内的小黑点(噪声)。

    为什么有了膨胀、腐蚀还要开运算闭运算呢?其实开闭运算最重要的一点就是,可以保持物体原有大小。然后一个是消除物体外部噪声(开运算)的另一个是增强物体之间连接点(闭运算)的。

三. python实现开运算和闭运算:

# Writer : wojianxinygcl@163.com

# Date   : 2020.3.21

import numpy as np

# Morphology Dilate

def Morphology_Dilate(img, Dil_time=1):

    H, W = img.shape

    # kernel

    MF = np.array(((0, 1, 0),

    (1, 0, 1),

    (0, 1, 0)), dtype=np.int)

    # each dilate time

    out = img.copy()

    for i in range(Dil_time):

        tmp = np.pad(out, (1, 1), 'edge')

        for y in range(1, H):

            for x in range(1, W):

                if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) >= 255:

                    out[y, x] = 255

    return out

# Morphology Erode

def Morphology_Erode(img, Erode_time=1):

    H, W = img.shape

    out = img.copy()

    # kernel

    MF = np.array(((0, 1, 0),

    (1, 0, 1),

    (0, 1, 0)), dtype=np.int)

    # each erode

    for i in range(Erode_time):

        tmp = np.pad(out, (1, 1), 'edge')

        # erode

            for y in range(1, H):

                for x in range(1, W):

                    if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) < 255*4:

                        out[y, x] = 0

    return out

# Morphology Closing

def Morphology_Closing(img, time=1):

    out = Morphology_Dilate(img, Dil_time=time)

    out = Morphology_Erode(out, Erode_time=time)

    return out

# Opening morphology

def Morphology_Opening(img, time=1):

    out = Morphology_Erode(img, Erode_time=time)

    out = Morphology_Dilate(out, Dil_time=time)

    return out

四. 开闭运算的效果:

    可以看到,图像开运算,消除了图像外部的噪声,图像闭运算,连通了更多的图像区域。

五. 参考内容:

    ①  https://www.cnblogs.com/wojianxin/p/12542459.html

    ②  https://blog.csdn.net/Ibelievesunshine/article/details/105018063

六. 版权声明:

形态学操作

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。

结构元素

图像处理经常要用到形态学操作,其中首先要获取结构元素。包括结构元素的大小及形状。

我们使用 Numpy 构建了结构化元素,它是正方形的。但有时我们需要构建一个椭圆形/圆形的核。为了实现这种要求,提供了 OpenCV函数 cv2.getStructuringElement()。你只需要告诉他你需要的核的形状和大小。

腐蚀 (erode)

定义E为欧氏空间,在二值图像A上使用B进行腐蚀运算的定义为:

其中 为B平移向量z得到。

在深蓝色正方形上使用圆盘进行腐蚀运算,结果为浅蓝色正方形。

腐蚀作用:可以用来消除小且无意义的物体。

参数意义如下:

例子

膨胀 (dilate)

定义E为欧氏空间,在二值图像A上使用B进行膨胀运算的定义为:

其中 为A平移向量b得到。

在深蓝色正方形上使用圆盘进行膨胀运算,结果为浅蓝色正方形,带有圆角。

膨胀作用:可以用来填补物体中的空洞。

参数意义同腐蚀。

例子

开运算
在数学形态学中,开运算 被定义为先腐蚀后膨胀。

其中 和 分别表示腐蚀和膨胀。

在深蓝色正方形上使用圆盘进行开运算,结果为浅蓝色正方形,带有圆角。

开运算作用:它被用来去除噪声

参数意义如下:

例子

闭运算

在数学形态学中,闭运算 被定义为先膨胀后腐蚀。

其中 和 分别表示腐蚀和膨胀。

在深蓝色区域(两个相连的正方形)上使用圆盘进行闭运算,结果为深蓝色和浅蓝色的并集。

闭运算作用:经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

cv2.MORPH_CLOSE代表闭运算,其他参数意义同开运算。

例子

形态学梯度
其实就是一幅图像膨胀与腐蚀的之差。

形态学梯度作用:提取前景物体的轮廓。

cv2.MORPH_GRADIENT代表形态学梯度,其他参数意义同开运算。

例子

礼帽
原始图像与进行开运算之后得到的图像的差。

例子

黑帽
进行闭运算之后得到的图像与原始图像的差。

例子

参考资料:
网址: https://en.wikipedia.org/wiki/Mathematical_morphology
书籍:《数字图像处理》《OpenCV-Python-Toturial-中文版》

形态学操作

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。

结构元素

图像处理经常要用到形态学操作,其中首先要获取结构元素。包括结构元素的大小及形状。

我们使用 Numpy 构建了结构化元素,它是正方形的。但有时我们需要构建一个椭圆形/圆形的核。为了实现这种要求,提供了 OpenCV函数 cv2.getStructuringElement()。你只需要告诉他你需要的核的形状和大小。

腐蚀 (erode)

定义E为欧氏空间,在二值图像A上使用B进行腐蚀运算的定义为:

其中 为B平移向量z得到。

在深蓝色正方形上使用圆盘进行腐蚀运算,结果为浅蓝色正方形。

腐蚀作用:可以用来消除小且无意义的物体。

参数意义如下:

例子

膨胀 (dilate)

定义E为欧氏空间,在二值图像A上使用B进行膨胀运算的定义为:

其中 为A平移向量b得到。

在深蓝色正方形上使用圆盘进行膨胀运算,结果为浅蓝色正方形,带有圆角。

膨胀作用:可以用来填补物体中的空洞。

参数意义同腐蚀。

例子

开运算
在数学形态学中,开运算 被定义为先腐蚀后膨胀。

其中 和 分别表示腐蚀和膨胀。

在深蓝色正方形上使用圆盘进行开运算,结果为浅蓝色正方形,带有圆角。

开运算作用:它被用来去除噪声

参数意义如下:

例子

闭运算

在数学形态学中,闭运算 被定义为先膨胀后腐蚀。

其中 和 分别表示腐蚀和膨胀。

在深蓝色区域(两个相连的正方形)上使用圆盘进行闭运算,结果为深蓝色和浅蓝色的并集。

闭运算作用:经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

cv2.MORPH_CLOSE代表闭运算,其他参数意义同开运算。

例子

形态学梯度
其实就是一幅图像膨胀与腐蚀的之差。

形态学梯度作用:提取前景物体的轮廓。

cv2.MORPH_GRADIENT代表形态学梯度,其他参数意义同开运算。

例子

礼帽
原始图像与进行开运算之后得到的图像的差。

例子

黑帽
进行闭运算之后得到的图像与原始图像的差。

例子

参考资料:
网址: https://en.wikipedia.org/wiki/Mathematical_morphology
书籍:《数字图像处理》《OpenCV-Python-Toturial-中文版》

数字图像处理中的膨胀原理是怎样的?

1.图像细化的基本原理

⑴ 图像形态学处理的概念

数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,还包括用于预处理或后处理的形态学过滤、细化和修剪等。图像形态学处理中我们感兴趣的主要是二值图像。

在二值图像中,所有黑色像素的集合是图像完整的形态学描述,二值图像的各个分量是Z2的元素。假定二值图像A和形态学处理的结构元素B是定义在笛卡儿网格上的集合,网格中值为1的点是集合的元素,当结构元素的原点移到点(x,y)时,记为Sxy,为简单起见,结构元素为3x3,且全都为1,在这种下,决定输出结果的是逻辑运算。

⑵ 二值图像的逻辑运算

逻辑运算尽管本质上很简单,但对于实现以形态学为基础额图像处理算法是一种有力的补充手段。在图像处理中用到的主要逻辑运算是:与、或和非(求补),它们可以互相组合形成其他逻辑运算。

⑶ 膨胀和腐蚀

膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的。

① 膨胀

是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。A被B膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为:

结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。

⑴ 用结构元素B,扫描图像A的每一个像素

⑵ 用结构元素与其覆盖的二值图像做“与”操作

⑶ 如果都为0,结果图像的该像素为0。否则为1

② 腐蚀

对Z中的集合A和B,B对A进行腐蚀的整个过程如下:

⑴ 用结构元素B,扫描图像A的每一个像素

⑵ 用结构元素与其覆盖的二值图像做“与”操作

⑶ 如果都为1,结果图像的该像素为1。否则为0

腐蚀处理的结果是使原来的二值图像减小一圈。

⑷ 击中(匹配)或击不中变换

假设集合A是由3个子集X,Y和Z组成的集合,击中(匹配)的目的是要在A中找到X的位置,我们设X被包围在一个小窗口W中,与W有关的X的局部背景定义为集合的差(W-X),则X在A内能得到精确拟合位置集合是由X对A的腐蚀后由(W-X)对A的补集Ac腐蚀的交集,这个交集就是我们要找的位置,我们用集合B来表示由X和X的背景构成的集合,我们可以令B=(B1,B2),这里B1=X,B2=(W-X),则在A中对B进行匹配可以表示为:

A⊙B

我们称为形态学上的击中或击不中变换。

⑸ 细化

图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个像素的线条细化成只有一个像素宽,形成“骨架”,形成骨架后能比较容易的分析图像,如提取图像的特征。

细化基本思想是“层层剥夺”,即从线条边缘开始一层一层向里剥夺,直到线条剩下一个像素的为止。图像细化大大地压缩了原始图像地数据量,并保持其形状的基本拓扑结构不变,从而为文字识别中的特征抽取等应用奠定了基础。细化算法应满足以下条件:

① 将条形区域变成一条薄线;

② 薄线应位与原条形区域的中心;

③ 薄线应保持原图像的拓扑特性。

细化分成串行细化和并行细化,串行细化即是一边检测满足细化条件的点,一边删除细化点;并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点。

常用的图像细化算法有hilditch算法,pavlidis算法和rosenfeld算法等。

注:进行细化算法前要先对图像进行二值化,即图像中只包含“黑”和“白”两种颜色。

还可以参考:http://blog.csdn.net/sunny3106/archive/2007/08/15/1745485.aspx

关键词是 数学形态学,

形态学之腐蚀操作

  形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。

  形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。

  例如,在识别手写数字时,能够通过形态算得到其骨架信息,在具体识别时,仅针对其骨架进行运算即可。形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域都有非常重要的应用。

  形态学操作主要包含:

  腐蚀操作和膨胀操作是形态算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等不同形式的运算。

  腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。

  腐蚀用来“收缩”或者“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。例如,在图8-1中,左图是原始图像,右图是对其腐蚀的处理结果。

  在腐蚀过程中,通常使用一个结构元来逐个像素地扫描要被腐蚀的图像,并根据结构元和被腐蚀图像的关系来确定腐蚀结果。

在OpenCV中,使用函数cv2.erode()实现腐蚀操作,其语法格式为:

式中:

【例8.2】使用函数cv2.erode()完成图像腐蚀。

六三科技网还为您提供以下相关内容希望对您有帮助:

图像处理中的腐蚀与膨胀是什么意思?

1、形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算;先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称...

图像开运算和闭运算

一. 图像形态学处理 —— 膨胀和腐蚀 二. 开运算与闭运算:    开运算:先腐蚀后膨胀,能够消除图像区域外的小白点(噪声)。    闭运算:先膨胀后腐蚀,能够消除图像区域内的小黑点(噪声)。

形态学操作-腐蚀与膨胀

形态学操作就是基于形状的一系列图像处理操作。一般情况下对二值化的图像进行操作。腐蚀与膨胀是最基本的形态学操作 应用:(1)消除噪声 (2)分割(isolate)独立的图像元素,以及连接(join)相邻的元素 (3)寻找图像中的明显的...

形态学之膨胀操作

膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空...

形态学操作

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体...

形态学滤波

数字形态学是图像处理的基本理论,这里简单介绍一下基本的形态学运算,针对的是灰度图像,包括:腐蚀与膨胀,开闭运算,形态学梯度,顶帽黑帽操作等等。(1)腐蚀:局部最小值运算。用一个核,与图像进行卷积,这个核会计算...

形态学操作:膨胀与腐蚀

形态学操作一般作用于二值化图,来 连接 相邻的元素或 分离 成独立的元素。腐蚀和膨胀是针对图片中的 白色部分 !膨胀就是求局部最大值的操作。按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称...

图像膨胀腐蚀算法原理

int borderType=BORDER_CONSTANT,//图像边界像素模式 const Scalar&amp; borderValue=morphologyDefaultBorderValue()//边界值 )6 /9 形态学开运算:开运算(Open Operation):先腐蚀后膨胀的过程;功能:消除小物体;在纤细处分离...

闭运算与膨胀运算相比有何优越性?

闭运算和膨胀运算是图像处理中的两种形态学操作。闭运算是先进行腐蚀操作,再进行膨胀操作。它的优越性在于以下几个方面:1. 消除小区域和孤立噪声:闭运算可以通过腐蚀操作收缩并消除小区域或者孤立的噪声点,然后通过膨胀操作...

形态学操作—膨胀与腐蚀(Dilation and Erosion)

膨胀和腐蚀被称为形态学操作。它们通常在二进制图像上执行,类似于轮廓检测。通过将像素添加到该图像中的对象的感知边界,扩张放大图像中的明亮白色区域。侵蚀恰恰相反:它沿着物体边界移除像素并缩小物体的大小。通常这两个操作...

Top