python opencv 形態變換
阿新 • • 發佈:2018-11-27
# 形態變換是根據圖片的形狀進行的簡單運算。一般被用在二值影象上。
# 它需要兩個輸入,一個是我們的原始圖片,另一個是被叫做結構元素或者是核,用來決定運算的型別
# 腐蝕
# 黑色增加
# 原始圖片裡的一個畫素(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)