任务描述
本关任务:编写对图像进行腐蚀运算的小程序。
相关知识
本关将介绍形态学中的腐蚀运算。
腐蚀运算
腐蚀运算是形态学中的基本运算,它的作用是提取图像的核心轮廓和结构而忽略图像中不重要的细节,腐蚀运算只能对二值图像进行运算,如下是一个腐蚀运算的例子:
最左侧是原图,剩下的三幅图是使用不同大小的结构元进行腐蚀运算的结果。可以看出,最右侧的图片只保留了原来的图片的核心部分,这就是腐蚀运算的效果。
腐蚀运算的过程是:遍历图像的每一个像素点,取当前像素点以及结构元映射到的所有像素点的像素的最小值,作为当前像素点的新的像素值。
比如下面是结构元:
黑色表示结构元的核心。
下面是原图像:
经过腐蚀后的结果如下:
可以看到,有两块原来是白色的像素点变成了黑色,我们来分析以下: 对于左侧中间的像素点,当遍历到它时,结构元映射到的像素点是它和它下方的像素点,取最小值则是0
(黑色的像素点的像素值是0
),所以它被染黑。 右侧中间的像素点同理。
python
腐蚀运算
opencv
的python
版本的腐蚀函数是erode
,它的原型是:
erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
各个参数的含义:
src
, 原图kernel
, 结构元dst=None
, 腐蚀后的图片anchor=None
, 核心iterations=None
, 迭代次数borderType=None
, 边界类型borderValue=None
,边界值
最后两个参数很少用到,可以忽略。
下面是一个使用矩形结构元腐蚀二值图像的代码实例:
import cv2
# 原图片的名字
pic = 'e_rode_yuan.png'
# 图像的二值化
src = cv2.imread(pic, cv2.IMREAD_UNCHANGED)
# 矩形结构元
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
# 进行腐蚀
erosion = cv2.erode(src, kernel)
# 展示原图
cv2.imshow('origin', src)
# 展示腐蚀后的图片
cv2.imshow('after erosion', erosion)
cv2.waitKey()
它的原图片如下所示:
腐蚀后的图片如下所示:
可以看到,四周的白色的线条全部腐蚀掉了,只剩下中心最核心的部分。
编程要求
根据提示,在右侧编辑器Begin
和End
之间补充代码,使用一个5x5
的交叉型结构元(核心在几何中心)对二值图片src
进行腐蚀,腐蚀后的图片保存到erosion
。
测试说明
平台会测试图片腐蚀后的打印结果。
输出结果:
12608502
开始你的任务吧,祝你成功!
import cv2
import numpy as np
# 原图片的名字
pic = '/data/workspace/myshixun/step3/原图/e_rode_yuan.png'
# 图像的二值化
src = cv2.imread(pic, cv2.IMREAD_UNCHANGED)
######### Begin #########
# 使用一个5x5的交叉型结构元(核心在几何中心)对二值图片src进行腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
# 将腐蚀后的图片保存
erosion = cv2.erode(src, kernel)
cv2.imwrite("/data/workspace/myshixun/step3/学员文件/erosion.jpg", erosion)
######### End #########
print(np.sum(erosion))