我正在使用具有这样的字典定义的图像进行处理:
python - 如何修剪匹配给定范围的数组中的值对?-LMLPHP
我想摆脱相邻条目(顶部和底部)中的那些小元素,如果它们接触到图像的上边界或底部边界,并且延伸距离不超过20个像素(不包括任何触摸顶部或底部的实际字母) ,如该图片所示(红色):
python - 如何修剪匹配给定范围的数组中的值对?-LMLPHP

我尝试这样做的方式是:
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个像素,请停止删除像素并恢复您擦除的像素,然后再使用列表中存储的坐标。
  • 从头开始重复,直到没有其他边框成分为止。
  • 08-15 22:31