目錄
1 核
2 腐蝕
3 膨脹
4 開運算
5 閉運算
6 禮帽運算
7 黑帽運算
8 形態學梯度
形態學變換是一種基于形狀的簡單變換,處理對象是二值化后的圖像。有兩個輸入:原圖像和核,一個輸出:形態學變換后的圖像。基本操作有以下四種。
1 核
核就是一個小區域,通常為3*3、5*5、7*7大小,比如矩形結構、橢圓結構、十字形結構,如下圖所示:
2 腐蝕
核在原圖(二值化后的圖像)上進行從上到下,從左到右的滑動。在滑動過程中,令核值為1的區域與該被核覆蓋的對應區域進行相乘,得到最小值,就是卷積核覆蓋區域中心像素點的新像素值。簡單記憶就是只要被覆蓋區域有黑色(像素值為0),那么該區域的中心像素值必定為黑色。經過腐蝕之后變“瘦”了。
通過這樣的遍歷方式,腐蝕操作能夠逐步收縮目標物體邊界,消除孤立的噪聲像素以及細化連續的前景區域。
總結:二值圖腐蝕后白色像素(非0)變少了
案例:
import cv2 as cv
import numpy as nplong = cv.imread("./images/long.png")
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# print(kernel)
# 腐蝕操作:cv2.erode(img,kernel,iterations=1)iterations:迭代次數,默認值為1
dst_erode = cv.erode(long,kernel=kernel,iterations=1)
cv.imshow("long",long)
cv.imshow("dst_erode",dst_erode)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
3 膨脹
核在滑動過程中,令核值為1的區域與被覆蓋的對應區域進行相乘,得到最大值就是被覆蓋區域中心像素點的新像素值。簡單記憶就是,只要有白色(像素值為255),那么區域的中心像素點必為白色(255)。經過膨脹之后變“胖”了。
膨脹能逐步擴大物體的邊界,連接斷裂的前景部分,并填充內部空洞,使物體輪廓更加明顯且連續。
總結:二值化膨脹后白色像素變多了。
案例:
import cv2 as cv
import numpy as nplong = cv.imread("./images/long.png")
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# print(kernel)
# 膨脹操作:cv2.dilate(img,kernel,iterations)
dst_dilate = cv.dilate(long,kernel=kernel,iterations=2)
cv.imshow("long",long)
cv.imshow("dst_dilate",dst_dilate)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
4 開運算
先腐蝕后膨脹,作用:分離物體,消除小區域。特點:消除噪聲,去除小的干擾塊,而不影響原來的圖像。
案例:
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 開運算(先腐蝕,后膨脹)
opening = cv.morphologyEx(car,cv.MORPH_OPEN,kernel)
cv.imshow("car",car)
cv.imshow("opening",opening)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
5 閉運算
先膨脹后腐蝕,作用:消除/閉合物體里面的孔洞。特點:可以填充閉合區域。
案例:
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 閉運算(先膨脹,后腐蝕)
closing = cv.morphologyEx(car,cv.MORPH_CLOSE,kernel)
cv.imshow("car",car)
cv.imshow("closing",closing)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
6 禮帽運算
原圖像與開運算結果圖之差。作用:用來分離比鄰近點亮一些的斑塊。
案例:
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 禮帽運算(原圖和開運算的差):cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
tophat = cv.morphologyEx(car,cv.MORPH_TOPHAT,kernel)
cv.imshow("car",car)
cv.imshow("tophat",tophat)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
7 黑帽運算
原圖與“閉運算”的結果圖只差。作用:用來分離比鄰近點暗一些的斑塊。
案例:
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 黑帽運算(閉運算和原圖之間的差):cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
blackhat = cv.morphologyEx(car,cv.MORPH_BLACKHAT,kernel)
cv.imshow("car",car)
cv.imshow("blackhat",blackhat)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
8 形態學梯度
形態學梯度是一個基于結構元素的圖像處理方法,它通過比較原圖像與膨脹圖和腐蝕圖之間的差異來突出圖像邊緣特征。 對于圖像中的每個像素點,其形態學梯度值是該像素點在膨脹后的圖像值與其在腐蝕后的圖像值之差。
作用:強化圖像的邊緣信息,并且對噪聲有一定的抑制作用
案例:
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 形態學梯度(膨脹和腐蝕的差):cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel)
gradient = cv.morphologyEx(car,cv.MORPH_GRADIENT,kernel)
cv.imshow("car",car)
cv.imshow("gradient",gradient)
cv.waitKey(0)
cv.destroyAllWindows()
輸出: