我正在使用具有这样的字典定义的图像进行处理:
我想摆脱相邻条目(顶部和底部)中的那些小元素,如果它们接触到图像的上边界或底部边界,并且延伸距离不超过20个像素(不包括任何触摸顶部或底部的实际字母) ,如该图片所示(红色):
我尝试这样做的方式是:
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
。
在您的情况下,我要做的就是简单地遍历图像边框上的像素,并使用增长区域算法除去那些接触边框的组件。更详细地: