python - 如何使用python在图像中绘制文本
问题描述
我有一张图片:
它有一些时间。
但我需要使用 python 将其转换为:
简而言之,我需要使用 python 将该图像中的文本绘制为黑色。我认为也许 opencv 对此有用,但不确定。我需要在任何时候都在同一类型的图像中这样做(比如编辑前的图像,只是不同的数字)。我认为我们可以使用 canny 来检测数字和点的边缘,然后将它们之间的区域涂成黑色。我不知道这样做的完美方式,但我认为它可能会奏效。希望有解决办法。提前致谢。
解决方案
我首先尝试使用 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()
推荐阅读
- c# - 保存“结果文件夹”的日期问题
- node.js - beforeUpdate 续集
- python - 如何停止运行不和谐的机器人进程(python)
- java - 如何将此 JSON 转换为 JAVA android 中的对象?
- c++ - 为什么这会导致Seg。故障,如何使用 GDB 调试它?
- c - 无法对动态分配节点的链表进行排序
- python - 在第一个空格之后排序列表项,然后是相同的单词
- node.js - 删除类的对象实例-NodeJS
- azure-logic-apps - Azure 事件中心日志使用查询对流进行排序
- c++ - c++中的`function() const &`中的`&`是什么?