如何使用 python 在图像中绘制文本

How to paint text in an image using python

我有一张图片:

它有一些时间。

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

这个: 对此

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

如前所述,由于相邻的 22 会产生问题,因此程序将如下所示

import numpy as np
import matplotlib.pyplot as plt
from skimage.segmentation import flood_fill

img = io.imread('number.png', as_gray=True)

plt.imshow(img, cmap='gray')

你申请了 flood fill

ff = flood_fill(img, (0,0), 125)
ff[ff != 125] = 0
ff[ff == 125] = 255

plt.imshow(ff, cmap='gray')

最后,保存图片

io.imsave('out.png', ff)

打开边框像素以区分字符和背景。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('j3iIp.jpg',0)
ret,thresh2 = cv2.threshold(img,120,255,cv2.THRESH_BINARY_INV)
cv2.imshow("result", thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()
img1 = cv2.imwrite("thresh4.jpg",thresh2)

我就是这样做的,我建议您尝试形态学操作,并寻找删除特定大小斑点的方法来解决“22”问题。您还可以调整公差值。

import cv2

imgray = cv2.imread('j3iIp.png',0)

point = (0,0)   

src = imgray.copy()

tolerance = 25
connectivity = 4
flags = connectivity
flags |= cv2.FLOODFILL_FIXED_RANGE

cv2.floodFill(src, None, point, (0, 255, 255), (tolerance,) * 3, (tolerance,) * 3, flags)

src = cv2.subtract(255, src) 

cv2.imshow('filled', src)

cv2.waitKey(0)

cv2.imwrite("result.jpg",src)

cv2.destroyAllWindows()

结果是:

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

可以使用 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()

此图中的代码结果