matlab图像的腐蚀和膨胀_Python 图像处理 OpenCV (8):图像腐蚀与图像膨胀

e0d1aed10a6bc4855fd680c7c4afb340.png

理论

图像的腐蚀( Erosion )和膨胀( Dilation )是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。

又出来新名词了:形态学。

图像处理中指的形态学,往往表示的是数学形态学。数学形态学( Mathematical morphology ) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。

没看懂没关系,上面那句概念出自「 OpenCV 3 入门编程 」,简单来讲,图像形态学就是改变图像的形状。

图像形态学一些基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等等。

ef06a6b202052bee4ce1c947de2b9982.png

其中图像的膨胀和腐蚀是最基础的图像形态学操作,他们主要的功能如下:

  • 消除噪声
  • 分割( isolate )出独立的图像元素,在图像中连接( join )相邻的元素。
  • 寻找图像中的明显的极大值区域或极小值区域
  • 求出图像的梯度

在接着往下看之前,有一点需要注意的是,图像的腐蚀与膨胀,主要针对的是二值图像(黑白图)的,其中进行变化的部分是图像的白色部分(高亮)部分,不是黑色部分。

图像膨胀就是图像中的高亮部分进行膨胀,「领域扩张」,效果图拥有比原图更大的高亮区域。

图像腐蚀就是原图中的高亮部分被腐蚀,「领域被蚕食」,效果图拥有比原图更小的高亮区域。

图像腐蚀

图像腐蚀其中有两个比较关键的输入对象,一个是二值图像,另一个是卷积核。

卷积核是腐蚀中的关键,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为 1 时,其值才为 1 ,否则其值修改为 0 。

下面是一个 5 * 5 的卷积核卷积的过程:

058180bfbbd39313a3b3eb374f381b25.png

OpenCV 为图像腐蚀提供的函数是:erode() ,它的原函数如下:

def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
  • src:原图像。
  • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
  • iterations:迭代次数,默认是迭代一次,表示进行一次腐蚀,如有需要,可进行多次迭代腐蚀。

示例代码如下:

import cv2 as cv
import numpy as np

# 图像读取
source = cv.imread("demo.png")

# 设置卷积核
kernel = np.ones((5, 5),np.uint8)

# 进行图像腐蚀,默认迭代 1 次
dst = cv.erode(source, kernel)

# 图像显示
cv.imshow("source", source)
cv.imshow("dst", dst)

# 等待操作
cv.waitKey(0)
cv.destroyAllWindows()
ae357efca0e98ed92a2f1f4a6b6bd5cc.png

我换一张图片迭代 5 次各位看下腐蚀的效果:

dst = cv.erode(source, kernel, iterations=5)
eca2d0bdd769681d772b07d65c586926.png

图像膨胀

图像膨胀正好和图像腐蚀相反,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只要有一个值为 1 时则为 1 ,否则为 0 。

图像膨胀卷积核的卷积过程如下:

5aa3b50bb3f532c410d0c143db68b585.png

OpenCV 为图像腐蚀提供的函数是:dilate() ,它的原函数如下:

def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
  • src:原图像。
  • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
  • iterations:迭代次数,默认是迭代一次,表示进行一次膨胀,如有需要,可进行多次迭代腐蚀。

示例代码如下:

import cv2 as cv
import numpy as np

# 图像读取
source = cv.imread("demo.png", cv.IMREAD_GRAYSCALE)

# 设置卷积核
kernel = np.ones((5, 5),np.uint8)

# 进行图像膨胀,默认迭代 1 次
dst = cv.dilate(source, kernel)

# 图像显示
cv.imshow("source", source)
cv.imshow("dst", dst)

# 等待操作
cv.waitKey(0)
cv.destroyAllWindows()
f6866340e8faa3486c792bba49e8a1cf.png

可以看到,膨胀后的图像比膨胀前的图像整整胖了一圈。

最后还是来个全家福,代码如下:

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
source = cv.imread('demo.png', cv.IMREAD_GRAYSCALE)

# 设置卷积核
kernel = np.ones((5, 5),np.uint8)

# 图像腐蚀
erode_img = cv.erode(source, kernel)

# 图像膨胀
dilate_result = cv.dilate(source, kernel)

# 显示结果
titles = ['Source Img','Erode Img','Dilate Img']
images = [source, erode_img, dilate_result]

# matplotlib 绘图
for i in range(3):
plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()
c41b8e62b2c41d6fcc833b1e634cdb0b.png

示例代码

如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取。

感谢阅读 b4a2b15cdb6be3ad3804b08de78d2c22.png

bc6dcd9cf50152f579003b697c3e4175.gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值