2017-02-25 40 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