圖像形態學處理包括腐蝕、膨脹、開運算、閉運算、形態學梯度、禮帽(頂帽)、黑帽等運算。
1、腐蝕
腐蝕可以理解爲前景像素會被腐蝕爲背景像素,以白色255爲前景,得到的效果就是白色變小、變細,黑色變大變粗:
import cv2
import numpy as np
img = cv2.imread('lena.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()
2、膨脹
與腐蝕相反的操作,效果是前景變大變粗,背景變小變細:
import cv2
import numpy as np
img = cv2.imread('lena.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()
3、閉運算
閉運算是先膨脹後腐蝕,這樣的處理結果是前景中的小黑洞會被填充: import cv2
import numpy as np
img = cv2.imread('lena.jpg',0)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow("img", img)
cv2.imshow("closing ", closing )
cv2.waitKey(0)
cv2.destroyAllWindows()
4、開運算
開運算與閉運算相對,是先腐蝕後膨脹,效果是講背景中的小亮點去掉:
import numpy as np
img = cv2.imread('lena.jpg',0)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow("img", img)
cv2.imshow("opening", opening )
cv2.waitKey(0)
cv2.destroyAllWindows()
5、形態學梯度
形態學梯度做的處理是一幅圖像的膨脹與腐蝕做差得到:
import numpy as np
img = cv2.imread('lena.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()
6、頂帽
頂帽是指原圖與開運算結果做差:
import numpy as np
img = cv2.imread('lena.jpg',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow("img", img)
cv2.imshow("tophat ", tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
7、黑帽
黑帽則是與頂帽相對,閉運算與原圖做差:
import numpy as np
img = cv2.imread('lena.jpg',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow("img", img)
cv2.imshow("tophat ", tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
8、結構化元素
前面的幾個處理中都有一個核,這個核都是用Numpy來構造的矩形核,其實還可以通過OpenCV提供的cv2.getStructuringElement()來獲取其它形狀的核:
# 矩形核
cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 橢圓形
cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
# 十字交叉
cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
南風之薰兮,
可以解吾民之慍兮。
南風之時兮,
可以阜吾民之財兮。