17 形态学转换
形态学操作:
腐蚀 膨胀 开运算 闭运算
常用函数:
cv2.erode()
cv2.dilate()
cv2.morphologyEx()
1 腐蚀
def erode(src, #源图像
kernel, #腐蚀操作的内核
dst=None, #输出图像
anchor=None, #内核中心点
iterations=None, #腐蚀次数
borderType=None, #推断边缘类型
borderValue=None) #边缘值
2 膨胀
def dilate(src, #源图像
kernel, #腐蚀操作的内核
dst=None, #输出图像
anchor=None, #内核中心点
iterations=None, #腐蚀次数
borderType=None, #推断边缘类型
borderValue=None) #边缘值
3 开运算
先腐蚀再膨胀
4 闭运算
先膨胀再腐蚀
5 形态学梯度
膨胀与腐蚀的差别
6 礼帽
原始图像与进行开运算进行后的图像的差
7 黑帽
进行闭运算之后得到的图像与原始图像的差
函数原型
def morphologyEx(src, #输入图像
op, #形态学运算类型
kernel, #内核
dst=None, #输出图像
anchor=None, #中心锚点
iterations=None, #函数迭代次数
borderType=None, #边界模式
borderValue=None)#常数边界值
结构化元素
print(cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)))
print(cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)))
print(cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)))
输出结果如下:
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
[[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]]
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
示例代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2016/11/17 14:59
# @Author : Retacn
# @Site :
# @File : imageErode.py
# @Software: PyCharm
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('../j.png')
kernel=np.ones((5,5),np.uint8)
#腐蚀
dst1=cv2.erode(img,kernel,iterations=1)
#膨胀
dst2=cv2.dilate(img,kernel,iterations=1)
#开运算
dst3=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭运算
dst4=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
#形态梯度学
dst5=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
#礼帽
dst6=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
#黑帽
dst7=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
#正常
plt.subplot(331),plt.imshow(img),plt.title('Normal')
plt.xticks([]),plt.yticks([])
#腐蚀
plt.subplot(332),plt.imshow(dst1),plt.title('Erode')
plt.xticks([]),plt.yticks([])
#膨胀
plt.subplot(333),plt.imshow(dst2),plt.title('Open')
plt.xticks([]),plt.yticks([])
#开运算
plt.subplot(334),plt.imshow(dst3),plt.title('Close')
plt.xticks([]),plt.yticks([])
#闭运算
plt.subplot(335),plt.imshow(dst4),plt.title('Dilate')
plt.xticks([]),plt.yticks([])
#形态学梯度
plt.subplot(336),plt.imshow(dst5),plt.title('Gradient')
plt.xticks([]),plt.yticks([])
#礼帽
plt.subplot(337),plt.imshow(dst6),plt.title('TopHat')
plt.xticks([]),plt.yticks([])
#黑帽
plt.subplot(338),plt.imshow(dst7),plt.title('BlackHat')
plt.xticks([]),plt.yticks([])
#输出结构化元素
print(cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)))
print(cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)))
print(cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)))
plt.show()