检测由空白像素分隔的轮廓

时间:2018-07-23 15:06:59

标签: python opencv

我目前正在尝试使用python图像中的角色的opencv检测轮廓,并在此特定轮廓周围绘制边界矩形。

问题是我有一个卡通人物“ <”,其中包括扫描它时产生的噪声,并且中间有1个像素的空白行。产生的轮廓发现它是2个不同的轮廓。

这里是角色:problem

(在检测轮廓之前,我正在应用二进制阈值)

有没有一种方法可以指示opencv连接两个彼此过于靠近的轮廓?

干杯, 阿斯特鲁斯

2 个答案:

答案 0 :(得分:0)

该代码可能会进行很多优化(大麦从编程开始),并且速度很慢,但可能会对您有帮助,或者只是为您提供一个思路。我所做的就是找到所有轮廓并将其绘制在空白蒙版上。然后,您可以使用cv2.findNonZero确定轮廓的所有非黑色(零)像素。之后,您可以搜索所有类似的点,例如x坐标相同且y坐标稍有不同的点(在示例图片+ -2中)-这表示您的空白。之后,您可以简单地用cv2.line()画线,它将填充空白。然后,只需再次搜索轮廓并绘制边界框即可。希望能帮助到你。干杯!

示例代码:

import cv2
import numpy as np

img  = cv2.imread('seperated_example.png')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_image,170,255,cv2.THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
mask = np.zeros(gray_image.shape,np.uint8)
cv2.drawContours(mask, contours, -1, 255, -1)
pixelpoints = cv2.findNonZero(mask)

for i in pixelpoints:
    for j in pixelpoints:
        if int(i[:,0]) == int(j[:,0]) and int(i[:,1]) == int(j[:,1]):
            pass
        else:
            if int(i[:,0]) == int(j[:,0]) and int(j[:,1])-2 <= int(i[:,1]) <= int(j[:,1])+2:
                cv2.line(img, (int(i[:,0]), int(i[:,1])), (int(j[:,0]), int(j[:,1])), (0,0,0), 1)

cv2.imwrite('seperated_result.png', img)
cv2.imshow('img', img)

img = cv2.imread('seperated_result.png')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_image,170,255,cv2.THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for i in contours:
    cnt = i
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),1)

cv2.imwrite('seperated_result2.png', img)
cv2.imshow('img2', img)

输入图像(黑色文本,白线将其分成两半):

enter image description here

结果:

enter image description here

enter image description here

答案 1 :(得分:0)

应用大小至少为3x3的中值过滤器。