1.腐蚀原理

(1)具体实现过程

腐蚀会把物体的边界腐蚀掉,卷积核沿着图像滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
在这里插入图片描述
在这里插入图片描述
B(Element)对图像A进行腐蚀的整个过程如下:
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素B与其覆盖的二值图像A做“与”操作
⑶ 如果都为1,结果图像的该像素为1。否则为0
腐蚀处理的结果是使原来的二值图像减小一圈。

通过上面的卷积过程其实也可以这样解释腐蚀:当我们对一张图像进行腐蚀的时候,也就是element单元区域内像素值的最小值要么是0(黑色),要么是1(白色);那么只要element区域中包含有黑色,那么最终得到黑色,只有当element区域内全为白色的,结果才是白色,所以对于白色的边缘区域都会变成黑色,和原来的图像相比,最终的图片白色区域减少,最后也就是达到了“腐蚀”的效果(图片的看上去像是被腐蚀了一样)。
在这里插入图片描述
图片来源:https://zhuanlan.zhihu.com/p/110787009


(2).函数讲解

:erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
Src:输入的原始图像
Kernel:结构单元(structuring element);
Dst:输出图像
Anchor:结构单元的锚点位置,默认值为(-1,-1),表示结构单元中心
Iterations:腐蚀迭代的次数
borderType:用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT
borderValue:边界值(如果是常量边界)。默认morphologyDefaultBorderValue具有特殊含义。对于侵蚀,它被转换为+\inf;对于膨胀,它被转换为-\inf,这意味着只有在图像内部的像素上才能有效地计算最小值(最大值)。


(3).代码实战

import os
import cv2
import numpy as np

def ErodeFilter(img_path='images/lenna.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(500,500))
    img=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
    kernel=np.ones((7,7),dtype=np.uint8)
    img=cv2.erode(src=img,kernel=kernel,iterations=1)
    cv2.imshow('img_src',img_src)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')
    ErodeFilter()

在这里插入图片描述


2.膨胀原理

(1)具体实现过程

结构单元(structuring element)在原始图像上进行滑动,把结构元锚点位置的图像像素点的灰度值设置为结构元值为1的区域对应图像区域像素的最大值。

B(Element)对图像A进行膨胀的整个过程如下:
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素B与其覆盖的二值图像A做“或”操作
⑶ 如果都为0,结果图像的该像素为0。否则为1;
腐蚀处理的结果是使原来的二值图像减小一圈。

在这里插入图片描述

(2)函数讲解

dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None): 

Src:输入的原始图像
Kernel:结构单元(structuring element);
Dst:输出图像
Anchor:结构单元的锚点位置,默认值为(-1,-1),表示结构单元中心
Iterations:腐蚀迭代的次数
borderType:用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT
borderValue:边界值(如果是常量边界)。默morphologyDefaultBorderValue具有特殊含义。对于侵蚀,它被转换为+\inf;对于膨胀,它被转换为-\inf,这意味着只有在图像内部的像素上才能有效地计算最小值(最大值)

获取卷积核:
https://mydreamambitious.blog.csdn.net/article/details/125265838

(3)代码实现

import os
import cv2
import numpy as np

def DilateFilter(img_path='images/Exen.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(500,500))
    img=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
    kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(7,7))
    img=cv2.dilate(src=img,kernel=kernel,iterations=1)
    cv2.imshow('img_src',img_src)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')
    DilateFilter()

在这里插入图片描述

GitHub 加速计划 / opencv31 / opencv
77.37 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68 Added Universal Windows Package build to CI. 1 天前
9b635da5 - 1 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐