python opencv 形态变换

# 形态变换是根据图片的形状进行的简单运算。一般被用在二值图像上。 # 它需要两个输入,一个是我们的原始图片,另一个是被叫做结构元素或者是核,用来决定运算的类型

# 腐蚀 # 黑色增加 # 原始图片里的一个像素(1或者0)只有在核下的所有像素都是1的时候才被认为是1.否则它就被腐蚀掉了(变成0) # 这个在移除小的白色噪点时很有用import cv2 import numpy as np from matplotlib import pyplot as plt %matplotlib inlineimg = cv2.imread('xingtai.jpg',0)kernel = np.ones((5,5), np.uint8) erosion = cv2.erode(img,kernel,iterations=1)cv2.imshow('img',img) cv2.imshow('erosion',erosion) cv2.waitKey(0) cv2.destroyAllWindows() # plt.subplot(121), plt.imshow(img),plt.title('img') # plt.subplot(122), plt.imshow(erosion),plt.title('erosion') # plt.imshow

# 膨胀 # 白色增加 # 核下只要有至少一个像素是1,像素的值就是1.所以它会增加图片上白色区域的范围或者前景物体的大小import cv2 import numpy as npimg = cv2.imread('xingtai.jpg',0)kernel = np.ones((5,5), np.uint8) dilation = cv2.dilate(img,kernel,iterations=1)cv2.imshow('img',img) cv2.imshow('dilation',dilation) cv2.waitKey(0) cv2.destroyAllWindows()

# 开 # 开就是腐蚀之后再膨胀的另一个名字 opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

# 闭 # 闭是开的反义词,膨胀之后再腐蚀,在用来关闭前景对象里的小洞或小黑点很有用。 closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

# 形态梯度 # 膨胀减腐蚀 # 结果看上去像是物体的轮廓import cv2 import numpy as npimg = cv2.imread('xingtai.jpg',0)kernel = np.ones((5,5), np.uint8) gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)cv2.imshow('img',img) cv2.imshow('gradient',gradient) cv2.waitKey(0) cv2.destroyAllWindows()

# 顶帽# 这个是输入图片和图片的开运算结果的差别import cv2 import numpy as npimg = cv2.imread('xingtai.jpg',0)kernel = np.ones((9,9), np.uint8) tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)cv2.imshow('img',img) cv2.imshow('tophat',tophat) cv2.waitKey(0) cv2.destroyAllWindows()

# 黑帽# 这是输入图片的闭的结果和输入图片的差别。import cv2 import numpy as npimg = cv2.imread('xingtai.jpg',0)kernel = np.ones((9,9), np.uint8) blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)cv2.imshow('img',img) cv2.imshow('blackhat',blackhat) cv2.waitKey(0) cv2.destroyAllWindows()

# 结构元素核 # 我们通过Numpy人工创建了结构元素。是个矩形,但是有些情况下,你可能会需要椭圆/圆型的核。 # 为了这个目的,OpenCV有一个函数cv2.getStructuringElement()。你把形状和核的大小作为参数传给它,你就可以得到想要的核。

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

    推荐阅读