基本概念
定義
形態(tài)學(xué)操作是根據(jù)圖像形狀進(jìn)行的簡單操作荆残。一般情況下對二值化圖像進(jìn)行的操作啼肩。需要輸入兩個參數(shù),一個是原始圖像硕盹,第二個被稱為結(jié)構(gòu)化元素或核符匾,它是用來決定操作的性質(zhì)的。兩個基本的形態(tài)學(xué)操作是腐蝕和膨脹莱睁。他們的變體構(gòu)成了開運(yùn)算待讳,閉運(yùn)算,梯度等仰剿。
結(jié)構(gòu)元素
圖像處理經(jīng)常要用到形態(tài)學(xué)操作,其中首先要獲取結(jié)構(gòu)元素痴晦。包括結(jié)構(gòu)元素的大小及形狀南吮。
使用 Numpy 構(gòu)建的結(jié)構(gòu)化元素,它是正方形的誊酌。但有時我們需要構(gòu)建一個橢圓形/圓形的核部凑。為了實(shí)現(xiàn)這種要求露乏,使用OpenCV函數(shù) cv2.getStructuringElement()。只需要告訴他需要的核的形狀和大小涂邀。
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cv_showimg(name,img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 矩形
kernel = np.ones((5,5),np.uint8)
kernel_1 = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
print("矩形:\n%s"%kernel)
print("矩形1:\n%s"%kernel_1)
# 橢圓
kernel_2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
print("橢圓:\n%s"%kernel_2)
# 十字形
kernel_3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print("十字:\n%s"%kernel_3)
矩形:
[[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]]
矩形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 1]]
橢圓:
[[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]]
十字:
[[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]]
矩形:
[[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]]
矩形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 1]]
橢圓:
[[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]]
十字:
[[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]]
基本形態(tài)學(xué)操作
腐蝕操作
在深藍(lán)色正方形上使用圓盤進(jìn)行腐蝕運(yùn)算瘟仿,結(jié)果為淺藍(lán)色正方形。
腐蝕作用:可以用來消除小且無意義的物體比勉。
dst =cv2.erode(src,kernel,iterations = 1)
參數(shù)意義如下:
- src:輸入圖像
- dst:輸出圖像
- kernel:核(結(jié)構(gòu)元素)
- iterations:迭代次數(shù)
img = cv2.imread('dige.png')
cv_showimg('img',img)
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv_showimg('erosion',erosion)
pie = cv2.imread('pie.png')
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
res = np.hstack((pie,erosion_1,erosion_2))
cv_showimg('res',res)
膨脹操作
在深藍(lán)色正方形上使用圓盤進(jìn)行膨脹運(yùn)算劳较,結(jié)果為淺藍(lán)色正方形,帶有圓角浩聋。
膨脹作用:可以用來填補(bǔ)物體中的空洞观蜗。
dst = cv2.dilate(src,kernel,iterations = 1)
參數(shù)意義如下:
- src:輸入圖像
- dst:輸出圖像
- kernel:核(結(jié)構(gòu)元素)
- iterations:迭代次數(shù)
kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 1)
cv_showimg('dilate',dilate)
pie = cv2.imread('pie.png')
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
res = np.hstack((pie,dilate_1,dilate_2))
cv_showimg('res',res)
開運(yùn)算
在數(shù)學(xué)形態(tài)學(xué)中,開運(yùn)算被定義為先腐蝕后膨脹衣洁。
開運(yùn)算作用:它被用來去除噪聲
opening = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
參數(shù)意義如下:
- src:輸入圖像
- cv2.MORPH_OPEN:形態(tài)學(xué)開運(yùn)算
- kernel:核(結(jié)構(gòu)元素)
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv_showimg('opening',opening)
高級形態(tài)學(xué)操作
閉運(yùn)算
在數(shù)學(xué)形態(tài)學(xué)中墓捻,閉運(yùn)算被定義為先膨脹后腐蝕。
閉運(yùn)算作用:經(jīng)常被用來填充前景物體中的小洞坊夫,或者前景物體上的小黑點(diǎn)砖第。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
參數(shù)意義如下:
- src:輸入圖像
- cv2.MORPH_CLOSE:形態(tài)學(xué)閉運(yùn)算
- kernel:核(結(jié)構(gòu)元素)
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv_showimg('closing',closing)
形態(tài)學(xué)梯度
其實(shí)就是一幅圖像膨脹與腐蝕的之差。
形態(tài)學(xué)梯度作用:提取前景物體的輪廓环凿。
gradient = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
參數(shù)意義如下:
- src:輸入圖像
- cv2.MORPH_GRADIENT:形態(tài)學(xué)閉運(yùn)算
- kernel:核(結(jié)構(gòu)元素)
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8)
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
cv_showimg('gradient',gradient)
禮帽操作
原始圖像與進(jìn)行開運(yùn)算之后得到的圖像的差厂画。
形態(tài)學(xué)禮帽作用:提取圖像中的噪聲。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
參數(shù)意義如下:
- src:輸入圖像
- cv2.MORPH_TOPHAT:形態(tài)學(xué)禮帽
- kernel:核(結(jié)構(gòu)元素)
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv_showimg('tophat',tophat)
黑帽
進(jìn)行閉運(yùn)算之后得到的圖像與原始圖像的差拷邢。
形態(tài)學(xué)黑帽作用:突出噪聲與原始圖像的交界處袱院,可近似表現(xiàn)出一些輪廓。
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
參數(shù)意義如下:
- src:輸入圖像
- cv2.MORPH_BLACKHAT:形態(tài)學(xué)黑帽
- kernel:核(結(jié)構(gòu)元素)
img = cv2.imread('dige.png')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv_showimg('blackhat',blackhat)