opencv_python学习笔记十四

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()

posted @ 2016-11-21 16:32  retacn_yue  阅读(268)  评论(0编辑  收藏  举报