- 首页 > it技术 > >
# 形态变换是根据图片的形状进行的简单运算。一般被用在二值图像上。
# 它需要两个输入,一个是我们的原始图片,另一个是被叫做结构元素或者是核,用来决定运算的类型
# 腐蚀
# 黑色增加
# 原始图片里的一个像素(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)
推荐阅读