1. 程式人生 > >python opencv 形態變換

python opencv 形態變換

# 形態變換是根據圖片的形狀進行的簡單運算。一般被用在二值影象上。
# 它需要兩個輸入,一個是我們的原始圖片,另一個是被叫做結構元素或者是核,用來決定運算的型別

# 腐蝕
# 黑色增加
# 原始圖片裡的一個畫素(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)