【发布时间】:2020-12-22 00:13:56
【问题描述】:
我有一张图像,我需要从中检测数字。我为此开发了一个 CNN 模型。但是因为我的图像是不同的颜色格式(不同于黑色背景中白色的 mnist 输入),我需要适当地处理我的图像。
这是输入图像。我需要将其转换为黑色背景中的白色,以便将其传递给我的模型以检测数字3。
我尝试从图像中移除边框,然后反转颜色以生成所需格式的图像。
到目前为止我的代码:
import cv2
import matplotlib.pyplot as plt
img_name = 'input.png'
image = cv2.imread(img_name, cv2.IMREAD_GRAYSCALE)
gray = cv2.resize(image, (256,256))
result = gray[40:216, 40:216]
所以上面的代码在调整图片大小后移除了边框。这是我现在使用cv2.imwrite()时得到的图像
然后我尝试如下反转颜色:
ans = cv2.bitwise_not(result)
ans1 = (ans//145)*255 # so the only values present are 0 and 255
这是我拥有的最后一张图片。由于3 的输入非常粗,我的模型倾向于将其预测为 8。任何有关如何以更好的方式处理图像的帮助都会非常有帮助。提前非常感谢。
编辑 1:
我想从图像中正确删除边框。在某些情况下,当我使用我的代码尝试时,图像也会被裁剪掉或边框仍然存在。
更多图片出现here
【问题讨论】:
-
您可以尝试对灰度图像进行阈值处理,以便获得更薄的字符。你也可以裁剪得更好一点,这样 3 的底部就不会被裁剪掉。你也可以在你的白色 3 上使用形态腐蚀来稀释它,或者使用形态做一些更适当的稀释。
-
骨架化会将所有字符转换为 1 像素宽度(粗)的行,如果您想“标准化”所有 blob 的厚度,这可能会派上用场.
-
@eldesgraciado 是的,骨架化只是故事的一半。我可能会使用一些膨胀来增加笔画的厚度。或者更好的方法是使用距离变换,任何像素超出一定百分比的距离由 DT 产生的最大值将保留。这将导致数字比骨架化版本略厚。
-
你为什么要坚持切边?除了最后一步之后的简单腐蚀之外,还可以让检测器更容易区分正确的数字。
标签: python image opencv image-processing mnist