OpenCV圖像處理之形態學處理

原理

形態學處理又稱爲形態學變換(Morphological Transformations),是圖像處理中一種基於形狀的簡單變換。它的處理對象通常是二值化圖像,也即只有黑白兩種顏色。通常,形態學變換有兩個輸入:原二值圖像,卷積核;一個輸出:變換後的圖像。
膨脹與腐蝕是最基本的兩種形態學變換方法,而除此之外的形態學處理的常規操作(開運算、閉運算、梯度運算、禮帽運算以及黑帽運算等)則是這兩種方法的組合。膨脹和腐蝕是針對較亮的像素的兩種相反的操作,即較亮的像素範圍會膨脹擴大和被暗色腐蝕變小。
腐蝕:卷積核的中心點逐個像素掃描原始圖像,被掃描到的原始圖像中的像素點,只有當卷積覈對應的元素全爲1時,其值才爲1,否則均爲0。
膨脹:卷積核的中心點逐個像素掃描原始圖像,被掃描到的原始圖像中的像素點,當卷積覈對應的元素只要有一個爲1時,其值便爲1,否則爲0。
開運算:圖像被腐蝕後,去除了噪聲,但是會壓縮圖像。對腐蝕後的圖像,進行膨脹處理,可以去除噪聲,並保持原有形狀。也即:開運算(image)=膨脹(腐蝕(image))。
閉運算:與開運算相反,閉運算是先膨脹,後腐蝕,它有助於關閉前景物體內部的小孔,或物體上的小黑點。也即:閉運算(image)=腐蝕(膨脹(image))
梯度運算:梯度運算即爲膨脹圖像減去腐蝕圖像從而得到輪廓圖像。也即:梯度(image)=膨脹(image)-腐蝕(image)。
禮帽運算:禮帽運算即爲原始圖像減去開運算的圖像,得到其中的噪聲圖像。也即:禮帽(image)=image-開運算(image)。
黑帽運算:黑帽運算即爲閉運算圖像減去原始圖像,得到圖片內部的小孔,或前景色中的小黑點。也即:黑帽(image)=閉運算(image)-image。

OpenCV是Python中用於圖像處理的一個很強大的庫,在此庫中,已經對圖像處理所需要的函數有很完備的封裝,在進行圖像處理的過程中可以直接調用相應的函數即可。
具體過程如下:
(1) 導入所要用到的圖像處理的OpenCV庫cv2和用於生成卷積核numpy庫;
(2) 以cv2.IMREAD_UNCHANGED格式讀入原圖像;
(3) 構造卷積核,根據實際所需設置大小,數據類型爲np.uint8;
(4) 利用OpenCV封裝的函數進行相應的形態學處理過程;
(5) 將原圖像和處理後的結果圖像進行顯示並比較分析;

程序及結果

圖像腐蝕

import cv2
import numpy as np
a = cv2.imread("image\\erode.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((5, 5), np.uint8)
b = cv2.erode(a, k, iterations=10)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
圖像膨脹

import cv2
import numpy as np
a = cv2.imread("image\\dilation.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((5, 5), np.uint8)
b = cv2.dilate(a, k, iterations=5)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
開運算

import cv2
import numpy as np
a = cv2.imread("image\\opening.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_OPEN, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
閉運算

import cv2
import numpy as np
a = cv2.imread("image\\closing.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_CLOSE, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
梯度運算

import cv2
import numpy as np
a = cv2.imread("image\\gradient.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_GRADIENT, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
禮帽運算

import cv2
import numpy as np
a = cv2.imread("image\\tophat.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((5, 5), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_TOPHAT, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述
黑帽運算

import cv2
import numpy as np
a = cv2.imread("image\\blackhat.bmp", cv2.IMREAD_UNCHANGED)
k = np.ones((10, 10), np.uint8)
b = cv2.morphologyEx(a, cv2.MORPH_BLACKHAT, k)
cv2.imshow("original", a)
cv2.imshow("result", b)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這裏插入圖片描述
在這裏插入圖片描述

分析

由上面結果可以看出,腐蝕使得原圖像中心亮區減少,也實現了去除邊緣的噪聲;膨脹使原圖像中心亮區擴大;開運算和閉運算則是腐蝕和膨脹的複合結合,分別實現了去除邊緣的噪聲和去除內部亮區黑洞;梯度運算利用膨脹後的圖像減去腐蝕後的圖像從而得到了圖像的邊緣;禮帽運算和黑帽運算分別得到了圖像邊緣的噪聲圖像和內部亮區的黑洞圖像。對比程序代碼可以發現,不同的操作之間,其實真正改變的只有運算對應的函數的使用和原圖像的存儲路徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章