五 OpenCV 图像处理 3-形态转换

形态学转换

  参考:opencv 官方教材

         ·不同的形态学转换:腐蚀、膨胀、开运算、闭运算

         ·函数     :erode/dilate/morphologyEx

·Erode 腐蚀

         将目标对象的边界腐蚀掉,原理为卷积核为中心为1其他为0的沿着图像滑动卷积,目的,将两个重叠的物体通过腐蚀分离出边界

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

 

#img = cv.imread('E:\\技术文档\\06CV\\erode.png',0)

img = cv.imread('E:\\erode.png',0)

 

kernel = np.ones((5,5),np.uint8)

erosion = cv.erode(img,kernel,iterations=1)

 

plt.subplot(321),plt.imshow(img),plt.title('Original')

plt.subplot(322),plt.imshow(erosion),plt.title('Erode')#标题

 

plt.show()

 

 

iterative 1与10次的结果

 

·Dilate膨胀

         与卷积核对应的原图像的像素值中只要有一个是 1,中心元 素的像素值就是 1。所以这个操作会增加图像中的白色区域(前景)。一般在去 噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变 小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是 前景还在并会增加。膨胀也可以用来连接两个分开的物体。

dilation = cv.dilate(img,kernel,iterations = 1)

 

·开运算

         先进性腐蚀再进行膨胀就叫做开运算,用来去除噪声。就像我们上面介绍的Erode/Dilate

opening = cv.morphologyEx(img,cv.MORPH_OPEN,kernel)

 

·闭运算

         先膨胀再腐蚀,为闭运算

closing = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel)

 

 

·形态学梯度

         其实就是一幅图像膨胀与腐蚀的差别,结果看上去,是物体的轮廓

gradient = cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel)

 

·礼帽

         原始图-开运算的图像=礼帽图像

tophat = cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)

 

·黑帽

         进行闭运算之后得到的图像与原始图像的差

blackhat= cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)

 

 

 

 

·结构化元素

         前面我们构造卷积核的时候,都是方形的,但是有时候我想要圆形的kernel

 

 

# Rectangular Kernel

>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

array([[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]], dtype=uint8)

# Elliptical Kernel

>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

array([[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]], dtype=uint8)

# Cross-shaped Kernel

>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

array([[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]], dtype=uint8)

 

posted on 2017-08-01 09:18  freeo  阅读(950)  评论(0编辑  收藏  举报