Morphological Transformations html
腐蝕的基本思想:侵蝕前景物體的邊界(老是試圖保持前景爲白色);內核在圖像中滑動(如在2D卷積中).只有當內核下的全部像素都是1時,原始圖像中的像素(1或0)纔會被認爲是1,不然它會被侵蝕(變爲零).函數
邊界附近的全部像素都將被丟棄,具體取決於內核的大小.所以,前景對象的厚度或大小減少,或者圖像中的白色區域減少.
它有助於消除小的白噪聲,分離兩個鏈接的對象
原圖:ui
代碼:spa
import cv2 import numpy as np img = cv2.imread('img7.png',0) kernel = np.ones((5,5),np.uint8) erosion = cv2.erode(img,kernel,iterations = 1) cv2.imshow('src',img) cv2.imshow('show',erosion) cv2.waitKey()
效果圖:code
它剛好與侵蝕相反。 這裏,若是內核下的至少一個像素爲「1」,則像素元素爲「1」. 所以它增長了圖像中的白色區域或前景對象的大小增長.
一般,在去除噪音的狀況下,腐蝕以後是膨脹.由於,侵蝕會消除白噪聲,但它也會縮小咱們的物體,因此咱們膨脹它,因爲噪音消失了,它們不會再回來,則咱們的物體區域會增長。 它也可用於鏈接對象的破碎部分.orm
代碼:htm
import cv2 import numpy as np img = cv2.imread('img7.png',0) kernel = np.ones((5,5),np.uint8) dilation = cv2.dilate(img,kernel,iterations = 1) cv2.imshow('src',img) cv2.imshow('show',dilation) cv2.waitKey()
cv2.morphologyEx()
:先腐蝕再膨脹,有助於消除噪音.
代碼:對象
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img8.png',0) kernel = np.ones((5,5),np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('src',img) cv2.imshow('show',opening) cv2.waitKey()
先膨脹後腐蝕,用於消除前景對象內的小孔或對象上的小黑點.
代碼:blog
import cv2 import numpy as np img = cv2.imread('img9.png',0) kernel = np.ones((5,5),np.uint8) closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.imshow('src',img) cv2.imshow('show',closing) cv2.waitKey()
圖像的膨脹和腐蝕之間的差別,結果看起來像目標的輪廓
代碼:ip
import cv2 import numpy as np img = cv2.imread('img7.png',0) kernel = np.ones((5,5),np.uint8) gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv2.imshow('src',img) cv2.imshow('show',gradient) cv2.waitKey()
原圖像與開運算圖的區別,突出原圖像中比周圍亮的區域
代碼:
import cv2 import numpy as np img = cv2.imread('img7.png',0) kernel = np.ones((5,5),np.uint8) tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.imshow('src',img) cv2.imshow('show',tophat) cv2.waitKey()
閉運算圖 - 原圖像,突出原圖像中比周圍暗的區域
代碼:
import cv2 import numpy as np img = cv2.imread('img7.png',0) kernel = np.ones((5,5),np.uint8) blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) cv2.imshow('src',img) cv2.imshow('show',blackhat) cv2.waitKey()
咱們在Numpy的幫助下建立了前面示例中的矩形結構元素. 但在某些狀況下,可能須要橢圓/圓形內核。 因此爲此,OpenCV有一個函數cv2.getStructuringElement()
. 只需傳遞內核的形狀和大小,便可得到所需的內核.
代碼:
# Rectangular Kernel cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) Out[4]: 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)) Out[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)) Out[6]: 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)