1. 程式人生 > >Python影象處理(7):利用輪廓分塊處理

Python影象處理(7):利用輪廓分塊處理

快樂蝦

歡迎轉載,但請保留作者資訊

在得到綠色植物的前景影象後,我們希望能夠進一步標識出其中的棉花植株和雜草。測試影象仍然是它:

首先要做的當然是對影象進行分割槽域處理。在上一步中我們得到了標識綠色植物的二值影象,一個很自然的想法是利用此二值影象的輪廓進行分塊。

# 獲取輪廓,我們的目的是分塊,因此只使用外層輪廓,使用點序列的形式
bin_img_save = np.copy(bin_img)
(contoures, hierarchy) = cv2.findContours(bin_img_save, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

這裡需要注意的是,在使用

findContours函式前必須將影象複製一份,否則此函式將改變傳入的影象資料。

計算的結果居然有49個區域,對於太小的區域其實我們並不關心,我們計算區域面積並從大到小進行排序。OpenCV提供了兩個排序函式,sortsortIdx,其中sort可以得到排序後的值陣列,而sortIdx能夠得到這些值在原陣列中的序號,因而這裡使用sortIdx

# 按面積排序
areas = np.zeros( len(contoures) )
idx = 0
for cont in contoures : 
    areas[idx] = cv2.contourArea(cont)
    idx = idx + 1
areas_s = cv2.sortIdx(areas, cv2.SORT_DESCENDING | cv2.SORT_EVERY_COLUMN)

然後處理面積大於100的區域:

(b8, g8, r8) = cv2.split(src)

# 對每個區域進行處理
for idx in areas_s :
    if areas[idx] < 100 :
        break

    # 繪製區域影象,通過將thickness設定為-1可以填充整個區域,否則只繪製邊緣
    poly_img = np.zeros( bin_img.shape, dtype = np.uint8 )
    cv2.drawContours(poly_img, contoures, idx, [255,255,255], -1)
    poly_img = poly_img & bin_img

    # 得到彩色的影象
    color_img = cv2.merge([b8 & poly_img, g8 & poly_img, r8 & poly_img])

    cv2.imshow('poly_img', color_img)
    cv2.waitKey()

目前我們僅僅是顯示這塊區域的彩色影象。最後得到這樣的結果:




我們需要正確標識這兩塊區域是棉花還是雜草。