数字图像处理(13): 形态学处理——图像开运算与图像闭运算

目录

1 图像开运算(先腐蚀,后膨胀)

1.1 基本原理

1.2 代码示例

2 图像闭运算(先膨胀,后腐蚀)

2.1 基本原理

2.2 代码示例

3 图像梯度运算(膨胀 — 腐蚀)

3.1 基本原理

3.2 代码示例

参考资料


前面介绍了 形态学处理——图像腐蚀与图像膨胀,图像膨胀会扩大一幅图像的组成部分,而图像腐蚀会缩小一幅图像的组成部分。下面将继续介绍形态学处理中的开操作和闭操作。

开操作一般会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。

闭操作同样也会平滑轮廓的一部分。但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。

 

1 图像开运算(先腐蚀,后膨胀)

1.1 基本原理

图像开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,可以去除噪声,并保留原有图像。如下图所示:

开运算:先腐蚀,后膨胀

 

下图借鉴是一篇博客写的开运算效果图:

 

1.2 代码示例

图像开运算使用函数 morphologyEx() ,它是形态学扩展的一组函数,其参数cv2.MORPH_OPEN对应开运算

morphologyEx() 函数形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

其中,参数:

dst 表示处理的结果;

src 表示原始图像;

cv2.MORPH_OPEN 表示开运算;

kernel 表示卷积核。

例如下图表示 5\times5 的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

(1)卷积核大小为5\times

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test3.bmp', cv2.IMREAD_UNCHANGED)

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

#图像开运算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

由上面结果可以看到,仍然有噪声存在,可以将增大卷积核的大小。

 

(2)卷积核大小为25\times25 

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test3.bmp', cv2.IMREAD_UNCHANGED)

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

#图像开运算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


 

2 图像闭运算(先膨胀,后腐蚀)

2.1 基本原理

图像闭运算是图像依次经过膨胀、腐蚀处理后的过程。图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。如下图所示:

闭运算:先膨胀,后腐蚀

 

下图借鉴是一篇博客写的开运算效果图:

 

 

2.2 代码示例

图像闭运算使用函数 morphologyEx() , 它是形态学扩展的一组函数,其参数 cv2.MORPH_CLOSE 对应闭运算

morphologyEx() 函数形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

其中,参数:

dst 表示处理的结果;

src 表示原图像;

cv2.MORPH_CLOSE 表示闭运算;

kernel表示卷积核。

例如,下图表示 5\times5 的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

(1)卷积核大小为 5\times

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test4.bmp', cv2.IMREAD_UNCHANGED)

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

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

由上面结果可以看到,噪声仍有一处存在,可以将增大卷积核的大小。

 

(2)卷积核大小为 7\times

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test4.bmp', cv2.IMREAD_UNCHANGED)

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

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


 

3 图像梯度运算(膨胀 — 腐蚀)

3.1 基本原理

图像梯度运算是膨胀图像减去腐蚀图像的结果,得到图像的轮廓,其中二值图像1表示白色点,0表示黑色点。 如下图所示:

梯度运算:膨胀图像 — 腐蚀图像

 

3.2 代码示例

图像梯度运算使用的函数 morphologyEx(),其参数 cv2.MORPH_GRADIENT 对应 梯度运算

morphologyEx() 函数形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)

其中,参数:

dst表示处理的结果;,

src表示原图像;,

cv2.MORPH_GRADIENT表示梯度运算;,

kernel表示卷积核。

例如,下图表示 5\times5 的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test4.bmp', cv2.IMREAD_UNCHANGED)

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

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


 

参考资料

[1] https://blog.csdn.net/Eastmount/article/details/83651172

[2] https://blog.csdn.net/hanshanbuleng/article/details/80657148

[3] Python+OpenCV图像处理

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页