gpt4 book ai didi

python - cv2.drawContours() - 取消填充字符内的圆圈(Python、OpenCV)

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:01 26 4
gpt4 key购买 nike

按照@Silencer 的建议,我使用了他发布的代码 here围绕我图像中的数字绘制轮廓。在某些时候,处理像 0,6,8,9 这样的数字时,我看到它们的内部轮廓(圆圈)也被填充了。我怎样才能防止这种情况发生?是否有为 cv2.drawContours() 设置的最小/最大 Action 区域,以便我可以排除内部区域?

example

我尝试传递 cv2.RETR_EXTERNAL 但使用此参数时仅考虑整个外部区域。

代码是这样的(再次感谢 Silencer。几个月来一直在寻找它......):

import numpy as np
import cv2

im = cv2.imread('imgs\\2.png')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#contours.sort(key=lambda x: int(x.split('.')[0]))

for i, cnts in enumerate(contours):
## this contour is a 3D numpy array
cnt = contours[i]
res = cv2.drawContours(im, [cnt], 0, (255, 0, 0), 1)
cv2.imwrite("contours.png", res)
'''
## Method 1: crop the region
x,y,w,h = cv2.boundingRect(cnt)
croped = res[y:y+h, x:x+w]
cv2.imwrite("cnts\\croped{}.png".format(i), croped)
'''
## Method 2: draw on blank
# get the 0-indexed coords
offset = cnt.min(axis=0)
cnt = cnt - cnt.min(axis=0)
max_xy = cnt.max(axis=0) + 1
w, h = max_xy[0][0], max_xy[0][1]
# draw on blank
canvas = np.ones((h, w, 3), np.uint8) * 255
cv2.drawContours(canvas, [cnt], -1, (0, 0, 0), -1)

#if h > 15 and w < 60:
cv2.imwrite("cnts\\canvas{}.png".format(i), canvas)

我正在处理的主图像..

src

谢谢

更新

我在下面实现了 Fiver 答案,结果如下:

import cv2
import numpy as np

img = cv2.imread('img.png')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
img_v = img_hsv[:, :, 2]

ret, thresh = cv2.threshold(~img_v, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for i, c in enumerate(contours):
tmp_img = np.zeros(img_v.shape, dtype=np.uint8)
res = cv2.drawContours(tmp_img, [c], -1, 255, cv2.FILLED)

tmp_img = np.bitwise_and(tmp_img, ~img_v)

ret, inverted = cv2.threshold(tmp_img, 127, 255, cv2.THRESH_BINARY_INV)

cnt = contours[i]

x, y, w, h = cv2.boundingRect(cnt)
cropped = inverted[y:y + h, x:x + w]

cv2.imwrite("roi{}.png".format(i), cropped)

最佳答案

绘制 char 而不填充封闭的内部区域:

  1. find the contours on the threshed binary image with hierarchy.

  2. find the outer contours that don't have inner objects (by flag hierarchyi).

  3. for each outer contour:

    3.1 fill it(maybe need check whether needed);

    3.2 then iterate in it's inner children contours, fill then with other color(such as inversed color).

  4. combine with the crop code, crop them.

  5. maybe you need sort them, resplit them, normalize them.
  6. maybe, now you can do ocr with the trained model.

FindContours,重新填充内部封闭区域。

enter image description here

结合这个答案Copy shape to blank canvas (OpenCV, Python) ,做更多的步骤,也许你可以得到这个或更好的:

enter image description here


重新填充内部封闭区域的核心代码如下:

#!/usr/bin/python3
# 2018.01.14 09:48:15 CST
# 2018.01.15 17:56:32 CST
# 2018.01.15 20:52:42 CST

import numpy as np
import cv2

img = cv2.imread('img02.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## Threshold
ret, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

## FindContours
cnts, hiers = cv2.findContours(threshed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]

canvas = np.zeros_like(img)
n = len(cnts)
hiers = hiers[0]

for i in range(n):
if hiers[i][3] != -1:
## If is inside, the continue
continue
## draw
cv2.drawContours(canvas, cnts, i, (0,255,0), -1, cv2.LINE_AA)

## Find all inner contours and draw
ch = hiers[i][2]
while ch!=-1:
print(" {:02} {}".format(ch, hiers[ch]))
cv2.drawContours(canvas, cnts, ch, (255,0,255), -1, cv2.LINE_AA)
ch = hiers[ch][0]

cv2.imwrite("001_res.png", canvas)

使用此图像运行此代码:

您将获得:

enter image description here


当然,这是针对两个层级的。我没有测试超过两个。有需要的可以自行测试。


更新:

注意在不同的 OpenCV 中,cv2.findContours 返回不同的值。为了保持代码的可执行性,我们可以只获取最后两个返回值使用:cnts, hiers = cv2.findContours(...)[-2:]

在 OpenCV 3.4 中:

enter image description here

在 OpenCV 4.0 中:

enter image description here


关于python - cv2.drawContours() - 取消填充字符内的圆圈(Python、OpenCV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259724/

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