1 引言
最近有小伙伴咨詢如何用傳統方法進行多個石頭檢測分割演算法, 原文如下所示:

嗯嗯,碰巧讓我這個問題,然而我碰巧學過影像處理的一些簡單知識.
我們都知道使用opencv可以快速進行影像的基本操作,那么我們就來嘗試解決這個問題吧.
2 解決方法
2.1 二值化
傳統影像分割,一般就是采用閾值分割的方法來區分前景物體和背景,這里使用全域閾值分割的方法來進行處理,方法如下:
img_file = "./sample.jpeg"
img1 = cv2.imread(img_file)
img = cv2.resize(img1,(640,400))
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, bin_img = cv2.threshold(gray_img, 120, 255, cv2.THRESH_BINARY )
運行后的效果如下:

上圖中,左側為原圖,右側為二值化后的結果圖.
2.2 去燥
觀測上圖,可以發現二值化后的影像還有很多噪聲,這里采用3X3中值濾波的方法進行去燥,代碼如下:
img_median = cv2.medianBlur(bin_img, 3)
運行效果如下:

左側為3X3去燥前的二值圖,右側為使用3X3模板去燥后的結果圖,可以看出很多零散的孤立點都被濾除.
2.3 腐蝕
二值影像的腐蝕操作為將影像中的前景物體白色部分進行縮減細化,其運行結果圖比原圖的高亮區域更小,我們這里選用3X3的十字形kernel進行腐蝕操作.
代碼如下:
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
erosion_img = cv2.erode(img_median, kernel, iterations=2)
結果如下:

上圖中左側為 iterations=1的腐蝕結果圖,表示只進行1次腐蝕操作;右側為iterations=2的腐蝕結果圖,表示連續進行2次腐蝕操作. 可以看出經過腐蝕操作后,前景物體分割的更開了.
2.4 膨脹
影像膨脹是腐蝕操作的逆操作,類似于“領域擴張”,將影像中的高亮區域或白色部分進行擴張,其運行結果圖比原圖的高亮區域更大,線條變粗了.
我們觀察腐蝕后的影像,發現很多區域內會有一些空洞點,這時我們需要膨脹操作,來消除這些空洞點,
代碼如下:
dilatation_type = cv2.MORPH_ELLIPSE
dilatation_size = 1
element = cv2.getStructuringElement(dilatation_type,
(2 * dilatation_size + 1, 2 * dilatation_size + 1),
(dilatation_size, dilatation_size))
dilate_img = cv2.dilate(erosion_img, element,iterations=3)
運行結果如下:

上圖為 采用3X3橢圓kernel進行3次膨脹后的結果圖
2.5 查找輪廓
觀察膨脹后的影像,可以看出石頭已經被我們分成一個個連續的獨立的封閉區域,這時我們可以使用opencv的findContours函式來尋找對應區域的外輪廓,代碼如下:
contours, hierarchy = cv2.findContours(dilate_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
out_img = img.copy()
for contour in contours:
cv2.drawContours(out_img, [contour, ], -1, (255 ,0, 255), 2) # pink
結果如下:

2.6 面積過濾
觀察上圖,我們的輸出會有一些錯檢,我們可以添加一些過濾條件,來進行過濾,有很多面積很小的區域被錯分割出來,這里采用面積來濾除部分錯檢,代碼如下:
for contour in contours:
area = cv2.contourArea(contour)
k = cv2.isContourConvex(contour)
if area>150:
cv2.drawContours(img, [contour, ], -1, (0, 0, 255), 2) # red
結果如下:

左側為濾除前的結果圖,右側為使用面積過濾后的結果圖.
3 總結
本文采用傳統影像處理方法,對石頭影像進行了簡單影像處理,可以得到分割出來的多個石頭的外輪廓和面積,最終效果如下:

雖然還有一些錯檢和漏檢,但是本文主要用于探討傳統影像處理的一些常用方法,
上述方案僅供學習交流使用,如有更好的策略,歡迎隨時交流.
關注公眾號《AI演算法之道》,獲取更多AI演算法資訊,

注: 關注公眾號,后臺回復 石頭 , 可獲取完整代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330083.html
標籤:AI
