python opencv 形态变换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TingHW/article/details/84527347
# 形态变换是根据图片的形状进行的简单运算。一般被用在二值图像上。
# 它需要两个输入,一个是我们的原始图片,另一个是被叫做结构元素或者是核,用来决定运算的类型

# 腐蚀
# 黑色增加
# 原始图片里的一个像素(1或者0)只有在核下的所有像素都是1的时候才被认为是1.否则它就被腐蚀掉了(变成0)
# 这个在移除小的白色噪点时很有用

import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

img = 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 np


img = 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 np

img = 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 np

img = 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 np

img = 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)

猜你喜欢

转载自blog.csdn.net/TingHW/article/details/84527347