我目前正在尝试使用python图像中的角色的opencv检测轮廓,并在此特定轮廓周围绘制边界矩形。
问题是我有一个卡通人物“ <”,其中包括扫描它时产生的噪声,并且中间有1个像素的空白行。产生的轮廓发现它是2个不同的轮廓。
(在检测轮廓之前,我正在应用二进制阈值)
有没有一种方法可以指示opencv连接两个彼此过于靠近的轮廓?
干杯, 阿斯特鲁斯
答案 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)
输入图像(黑色文本,白线将其分成两半):
结果:
答案 1 :(得分:0)
应用大小至少为3x3的中值过滤器。