首页 > 解决方案 > 如何使用python在图像中绘制文本

问题描述

我有一张图片:

它有一些时间。

但我需要使用 python 将其转换为:

这个: 在此处输入图像描述 到这个 在此处输入图像描述

简而言之,我需要使用 python 将该图像中的文本绘制为黑色。我认为也许 opencv 对此有用,但不确定。我需要在任何时候都在同一类型的图像中这样做(比如编辑前的图像,只是不同的数字)。我认为我们可以使用 canny 来检测数字和点的边缘,然后将它们之间的区域涂成黑色。我不知道这样做的完美方式,但我认为它可能会奏效。希望有解决办法。提前致谢。

标签: pythonimageopencvtextpaint

解决方案


我首先尝试使用 cv2.findContours() 但是每个字符内部的空白和锁定在 22 之间的空白之间没有层次差异。 Epsi95 的解决方案中显示的“22 问题”无法使用轮廓层次信息解决。

该问题可以通过使用 cv2.floodFill() 和水平边缘检测来确定每个对象的种子点来解决。

import cv2
import matplotlib.pyplot as plt
import numpy as np

# Fixed colon locations (assumed to be known constants)
Y1, Y2 = (24, 48)
X1, X2 = (45, 93)

# Plot grayscale image
img = np.uint8(cv2.imread("digits.png", cv2.IMREAD_GRAYSCALE) / 255)
fig, axs = plt.subplots(2)
axs[0].imshow(img, cmap="gray")

# Horizontal edge detection at Y1 to determine the seed points (for flood filling)
kernel = np.array([-1, -1, 1, 1], dtype=np.int8)  # bbww detector
edge_det = np.correlate(img[Y1, :], kernel, mode="same")  # 2 @ bbWw
edge_xloc = np.flatnonzero(edge_det == 2)
seeds_yx = np.array(
    [
        [Y1, edge_xloc[1]],
        [Y1, edge_xloc[edge_xloc < X1][-2]],
        [Y1, X1],
        [Y1, edge_xloc[edge_xloc > X1][1]],
        [Y1, edge_xloc[edge_xloc < X2][-2]],
        [Y1, X2],
        [Y1, edge_xloc[edge_xloc > X2][1]],
        [Y1, edge_xloc[-2]],
        [Y2, X1],
        [Y2, X2],
    ]
)
axs[0].plot(seeds_yx[:, 1], seeds_yx[:, 0], "ro")

# Flood fill at seed points
for y, x in seeds_yx:
    cv2.floodFill(img, mask=None, seedPoint=(x, y), newVal=0)
axs[1].imshow(img, cmap="gray")
fig.show()

此图中的代码结果填充数字


推荐阅读