gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:42:54 25 4
gpt4 key购买 nike

我正在处理具有字典中定义的图像,例如:
This is what I have
我想从相邻条目(顶部和底部)中删除那些小元素,如果它们触及图像的上边界或底部边界并且从它延伸不超过 20 像素(不包括任何实际接触顶部或底部的字母) ,如图所示(红色):
This is what I want

我尝试这样做的方式是:
1.加载灰度图像
2. 使用cv2.findContours获取图像的轮廓
3. 找到从 x = 0 开始但不超过 x = 20 结束的等高线
4. 找到从 height-1 开始到 height-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 像素,请停止删除像素并恢复您删除的像素,然后再使用列表中存储的坐标。
  • 从头开始重复,直到没有其他边框组件留下。
  • 关于python - 如何修剪与给定范围匹配的数组数组中的值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42457785/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com