2017-02-25 70 views
0

我正在使用像這樣的詞典中的圖像定義: This is what I have 我想擺脫鄰居條目(頂部和機器人)的那些小元素,如果他們觸摸圖像的上部或機器人邊界和延伸不超過從它20個像素(不包括任何實際的字母觸摸頂部或機器人),因爲這表示圖像(紅色): This is what I want如何修剪匹配給定範圍的數組數組中的值對?

的方式我試圖做它是: 1.加載的圖像灰度 2.使用cv2.findContours 獲取圖像的輪廓3.查找從x = 0開始但不超過x = 20的輪廓 4. F ind輪廓從高度1開始並以高度結束-21 5.用白色畫這些輪廓

問題是cv2.findContours返回座標對數組數組列表。雖然我能夠刪除某些座標對,但我在這裏很難應用。

我嘗試了許多方法,目前我堅持這一點:

import cv2 
import os 
def def_trimmer(img): 
    height, width = img.shape 
    img_rev = cv2.bitwise_not(img) 
    _, contours, _ = cv2.findContours(img_rev,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) 
    # contours = np.concatenate(contours, axis = 0) 
    # contours = contours[((contours<[20-1, width])|(contours>[height-20-1, -1])).all(axis=(1,2))] 
    for outer in contours: 
     # for outer2 in outer1: 
     oldlen = len(outer) 
     outer = outer[(((outer<[20-1, width])|(outer>[height-20-1, -1])).all(axis=(1, 2)))] 
     newlen = len(outer) 
     print((oldlen, newlen)) 
    cv2.drawContours(img,contours,-1,(255,255,255),-1) 
    return(img) 
img = cv2.imread("img.png") 
img_out = def_trimmer(img) 
cv2.imshow("out", img_out) 

回答

1

我認爲這是沒有必要在這裏使用findContours

我想在你的情況下做的是簡單地遍歷圖像邊界上的像素,並使用增長區域算法刪除那些觸摸邊界的組件。更詳細地說:

  • 遍歷邊界像素,直到找到一個黑色像素爲止。
  • 初始化列表以存儲像素座標。
  • 使用相鄰黑色像素的遞歸來移除它們並將它們的座標存儲在列表中。如果遞歸距離圖像邊界超過20個像素,請停止移除像素,並在使用列表中存儲的座標之前還原已擦除的像素。
  • 從頭開始重複,直到沒有剩下其他邊框組件。
+0

感謝您的建議。這可能確實更快,更容易。我會盡快試一試:) – MrVocabulary