如何使用Open CV缩小图像中的符号

时间:2018-11-26 21:22:12

标签: python python-3.x opencv image-processing cv2

我正在尝试使用Open CV缩小图像中的数字。我目前能够识别轮廓,但是一旦确定了轮廓,就很难弄清楚如何按比例缩小数字。

以下是示例图片: numbers

这是我确定的轮廓:

Contours

这是我用来实现此目的的代码:

import cv2

image = cv2.imread("numbers.png")
edged = cv2.Canny(image, 10, 250)


# applying closing function
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)



_, cnts,_ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, 
cv2.CHAIN_APPROX_SIMPLE)
contours = []


for c in cnts:

    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    contours.append(approx)

    cv2.drawContours(image, [approx], -1, (0, 255, 0), 2)


cv2.imshow("Output", image)
cv2.waitKey(0)

我希望能够使用轮廓线缩小数字,而不会影响图像的尺寸。这可能吗?谢谢!

1 个答案:

答案 0 :(得分:5)

假设您有一个名为“ numbers.png”的输入图像。 enter image description here

首先,导入有用的库并加载输入图像:

['[brown=[fox[a=b][c=d]]]', '[lazy=dog]']

第二,您需要对输入图像进行二值化处理,并找到数字的外部轮廓:

import cv2
import numpy as np

img = cv2.imread("./numbers.png", 1)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

因此您可以看到检测到的轮廓将围绕数字。 enter image description here

第三,找到数字周围的相对边界框,并找到这些框的中点坐标(我假设应该调整数字的大小并放在底线的中心):

_, im_th = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
_, contours, _ = cv2.findContours(255-im_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

最后,调整数字大小,将其放回图像中,并显示结果:

number_imgs = []
number_btm_mid_pos = []
for cnt in contours:
    (x, y, w, h) = cv2.boundingRect(cnt)
    number_imgs.append(img[y:y+h, x:x+w])
    number_btm_mid_pos.append((int(x+w/2), y+h))

您可以调整变量“ resize_ratio”以确保该比率符合您的期望。结果应该是这样的图像: enter image description here

您可能会注意到最后一个数字“ 10”正在分开。这是因为“ 1 0”被识别为两个单独的数字。为了使其完美,可以编写一些代码来测试每两位数字之间的间隔/距离。但是,这并不紧密相关,并且基于有限的测试输入很难概括该解决方案。所以我在这里停止。

无论如何,祝你好运,玩得开心。