ERDAS数学形态学(Morphological)运算,其中包含腐蚀(Erode)、膨胀(Dilate)、开运算(Open)、闭运算(Close)
在用ERDAS Imagine 2014做水体提取时,需要用到形态学运算,在软件菜单栏"Rster tab → Spatial → Morphological"工具下有个Function选择列表,里面有Erode(腐蚀)、Dilate(膨胀)、Open(开运算)、Close(闭运算)这四个函数,今天我们用Python的CV2库对相关的概念做一下深入地理解。(附源代码)
- 前期准备:
-
模版的选择:
-
3*3的矩形结构模版
kernel01 = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # 矩形结构
[[1 1 1]
[1 1 1]
[1 1 1]]
- 5*5的椭圆结构模版
kernel02 = cv.getStructuringElement(cv.MORPH_ELLIPSE, (3, 3)) # 椭圆结构
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]
- 3*3的十字结构模版
kernel03 = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3)) # 十字结构
[[0 1 0]
[1 1 1]
[0 1 0]]
2 实验图片
-
图片一:彩色图像
-
图片二:黑白二值图像(与黑白图像相比,它是有一个个的小颗粒组成的)
- 开始实验
- 腐蚀Erode
腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。
腐蚀的算法:用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。
结果:使二值图像减小一圈
erosion = cv.erode(src, kernel01, iterations=3)# 进行腐蚀处理
鱼-黑白图像膨胀处理结果
鱼-黑白二值图像腐蚀处理结果
3. 膨胀Dilate
膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。
膨胀的算法:用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素为0。否则为1。
结果:使二值图像扩大一圈
erosion = cv.dilate(src, kernel01, iterations=3)# 进行膨胀处理
鱼-黑白图像膨胀处理结果
鱼-黑白二值图像膨胀处理结果
4. 开运算Open
先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体,这样容易记住)
作用:用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。(分离物体,消除小区域。)
erosion = cv.morphologyEx(src, cv.MORPH_OPEN, kernel01)
鱼-黑白图像开运算处理结果
鱼-黑白二值图像开运算处理结果
5. 闭运算Close
先膨胀后腐蚀的过程称为闭运算。(先膨胀会使白色的部分扩张,以至于消除或闭合物体里面的小黑洞,所以叫闭运算)
作用:用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
erosion = cv.morphologyEx(src, cv.MORPH_CLOSE, kernel01)
鱼-黑白图像闭运算处理结果
鱼-黑白二值图像闭运算处理结果
- 最终实现代码
import cv2 as cv
import numpy as np
#形态学运算中腐蚀(erode),膨胀(dilate),开运算(open)和闭运算(close)。
# 读入图片cv.imread(),返回的是个数组ndarray(dtype=uint8),其中数值我们也可以更改。
# cv2.IMREAD_COLOR (默认读取方式,也可以用1来代替): 读取彩色图片,不包括alpha值(透明度)
# cv2.IMREAD_GRAYSCALE (也可以用0来代替): 图像灰度处理,这样压缩了了图片尺寸,但也会丢失特征。
# cv2.IMREAD_UNCHANGED (也可以用-1来代替): 读取彩色图片,且包括alpha值(透明度)
# src = cv.imread('E://images//fungis//fungisImg01.jpg', flags=1)#彩色图像
# src = cv.imread('E://images//fungis//fungisImg01.jpg', flags=0)#黑白图像
src = cv.imread('G://pythonCode//ContestDemo//fish.jpg', flags=1)#彩色图像
# src = cv.imread('G://pythonCode//ContestDemo//fish.jpg', flags=0)#黑白图像
# src = cv.imread('G://pythonCode//ContestDemo//fish01.png', flags=0)#二值图像
#存储处理后的图片
# cv.imwrite('cat0.png', src)
# 生成卷积核
kernel01 = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # 矩形结构
kernel02 = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel03 = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3)) # 十字结构
print(kernel01)
# print(kernel02)
# print(kernel03)
# 腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。
# 腐蚀的算法:
# 用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。
# 结果:使二值图像减小一圈
# erosion = cv.erode(src, kernel01, iterations=3)# 进行腐蚀处理
# 图像处理类型:
# 膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。
# 膨胀的算法:
# 用3x3的结构元素,扫描图像的每一个像素, 用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素为0。否则为1
# 结果:使二值图像扩大一圈
# erosion = cv.dilate(src, kernel01, iterations=3)# 进行膨胀处理
# 先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体,这样容易记住)
# 用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。(分离物体,消除小区域。)
# erosion = cv.morphologyEx(src, cv.MORPH_OPEN, kernel01)
# 先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
# 先膨胀后腐蚀(先膨胀会使白色的部分扩张,以至于消除/"闭合"物体里面的小黑洞,所以叫闭运算)
erosion = cv.morphologyEx(src, cv.MORPH_CLOSE, kernel01)
# 添加说明文字1
ori = src.copy("C")
cv.putText(ori, "Original", (520, 100), cv.FONT_HERSHEY_COMPLEX, 2.0, (150, 10, 0), 5)
# 添加说明文字2
cv.putText(erosion, "Success Image", (520, 100), cv.FONT_HERSHEY_COMPLEX, 2.0, (150, 150, 0), 5)
# 将原图片与腐蚀处理后的图片拼接起来
show = np.hstack([ori, erosion])
# 显示图片
cv.namedWindow('fungis', cv.WINDOW_NORMAL)
cv.imshow('fungis', show)#窗口大小会自动拟合图片尺寸
cv.waitKey(0)
cv.destroyAllWindows()
来源:CSDN
作者:努力搬砖的giser
链接:https://blog.csdn.net/qq_41441896/article/details/103656159