ERDAS 数学形态学(Morphological)运算(其中包含腐蚀Erode、膨胀Dilate、开运算Open、闭运算Close)-Python CV2库

老子叫甜甜 提交于 2019-12-22 23:03:26

ERDAS数学形态学(Morphological)运算,其中包含腐蚀(Erode)、膨胀(Dilate)、开运算(Open)、闭运算(Close)

在用ERDAS Imagine 2014做水体提取时,需要用到形态学运算,在软件菜单栏"Rster tab → Spatial → Morphological"工具下有个Function选择列表,里面有Erode(腐蚀)、Dilate(膨胀)、Open(开运算)、Close(闭运算)这四个函数,今天我们用Python的CV2库对相关的概念做一下深入地理解。(附源代码)
在这里插入图片描述

  1. 前期准备:
  • 模版的选择:

  • 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 实验图片

  • 图片一:彩色图像
    在这里插入图片描述

  • 图片二:黑白二值图像(与黑白图像相比,它是有一个个的小颗粒组成的)

鱼-二值图像

  1. 开始实验
  • 腐蚀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)

闭运算鱼-黑白图像闭运算处理结果
黑白闭运算
鱼-黑白二值图像闭运算处理结果
在这里插入图片描述

  1. 最终实现代码
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()

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!