1. 程式人生 > >使用Python-OpenCV消除影象中孤立的小區域

使用Python-OpenCV消除影象中孤立的小區域

之前一直使用Skimage中的形態學處理來進行孤立小區域的去除,程式碼如下

img = morphology.remove_small_objects(img, size)
img = morphology.remove_small_holes(img, size)

後面需要將相應演算法翻譯到C++環境中,而Skimage沒有對應的C++版本,為了確保python演算法和C++演算法結果的一致性,需要進行遷移,因而打算使用OpenCV來重寫去除孤立小區域的程式碼。程式碼如下:

 _,binary = cv2.threshold(img,0.1,1,cv2.THRESH_BINARY)
  image,contours,hierarch=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    for i in range(len(contours)):
        area = cv2.contourArea(contours[i])
        if area < threshold:
            cv2.drawContours(image,[contours[i]],0,0,-1)

其中對於輸入影象img首先使用閾值處理獲得二值化影象,cv2.threshold表示進行閾值二值化處理,0.1是設定的閾值(img是0-1影象),1表示影象中的最大值,cv2.THRESH_BINARY表示影象處理的方法,在openCv中有如下記錄

 

然後使用findContours,用來獲得二值化影象的輪廓資訊,findContours中cv2.RETR_EXTERNAL是表示輪廓獲取方式,是表示內圈的輪廓不需要進行獲取,cv2.CHAIN_APPROX_NONE表示是輪廓曲線記錄的方式,CHAIN_APPROX_NONE表示記錄所有的輪廓點,具體的引數說明可以參看:

然後,後面的contourArea是用來獲取輪廓所包圍的面積,threshold是面積閾值,當小於該閾值時認為是孤立小區域,需要去除

最後drawContours是對孤立小區域進行去除的方式,去除操作比較簡單,就是往這些區域裡面填充為0即可,drawContours的參量可參考如下:

這裡,drawContours的第一個參量是輸入待處理影象,第二個參量是將要處理的孤立區域輪廓Vector,第三個參量是表示輪廓的座標,這裡為0表示contours的第一個,第四個參量表示填充的數值,這裡是integer的情況下則表明是灰度圖,填充為1,而最後一個參量為-1,是thickness,表明按照填充方式處理該輪廓圍繞的區域