Python 如何修剪与给定范围匹配的数组数组中的值对?

Python 如何修剪与给定范围匹配的数组数组中的值对?,python,arrays,opencv,numpy,Python,Arrays,Opencv,Numpy,我正在使用字典中定义的图像,例如: 我想去掉相邻条目top和bot中的那些小元素,如果它们接触到图像的上边界或bot边界,并且从中延伸不超过20个像素,不包括任何实际接触top或bot的字母,如图中红色所示: 我尝试这样做的方式是: 1.加载灰度图像 2.使用cv2.findContours获取图像的轮廓 3.查找从x=0开始但不超过x=20结束的轮廓 4.查找从高度-1开始到高度-21结束的轮廓 5.把这些轮廓画成白色 问题是cv2.findContours返回一个由坐标对数组组成的数组列表

我正在使用字典中定义的图像,例如: 我想去掉相邻条目top和bot中的那些小元素,如果它们接触到图像的上边界或bot边界,并且从中延伸不超过20个像素,不包括任何实际接触top或bot的字母,如图中红色所示:

我尝试这样做的方式是: 1.加载灰度图像 2.使用cv2.findContours获取图像的轮廓 3.查找从x=0开始但不超过x=20结束的轮廓 4.查找从高度-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)

我认为没有必要在这里使用findContours

在你的例子中,我要做的是简单地迭代图像边界上的像素,并使用增长区域算法删除那些接触边界的组件。更详细地说:

在边界像素上迭代,直到找到一个黑色像素。 初始化列表以存储像素坐标。 对相邻的黑色像素使用递归删除它们,并将它们的坐标存储在列表中。如果递归距离图像边界的距离超过20个像素,请停止移除像素,并在使用列表中存储的坐标之前恢复已擦除的像素。 从头开始重复此操作,直到没有其他边框组件。
谢谢你的建议。这可能会更快更容易。我将很快尝试一下: