【问题标题】:Processing image as input for mnist model处理图像作为 mnist 模型的输入
【发布时间】: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


【解决方案1】:

一种方法是减去每个像素:(255 - gray)

import cv2

img = cv2.imread("gHeKR.png")
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
inverted = 255 - grey
cv2.imwrite("inverted.png", cv2.resize(inverted, (256, 256)))

结果:

但是,问题可能只靠image-processing解决不了

但是因为我的图像是不同的颜色格式(不同于黑色背景中的白色 mnist 输入),我需要适当地处理我的图像。

图像颜色格式对于卷积层来说应该不是问题。

假设您的想法 100% 正确。然后使用keras 图像生成器填充图像。这个想法是从给定图像中填充更多样本,以便分类器学习正确的标签。

例如:

from keras.preprocessing.image import load_img, img_to_array
from keras.preprocessing.image import ImageDataGenerator

# Total Generated number
total_number = 5

data_gen = ImageDataGenerator(rescale=1. / 255, shear_range=0.2,
                              zoom_range=0.2, horizontal_flip=True)

# Create image to tensor
img = load_img("3/3.png", grayscale=True)
arr = img_to_array(img)
tensor_image = arr.reshape((1, ) + arr.shape)

for i, _ in enumerate(data_gen.flow(x=tensor_image,
                                 batch_size=1,
                                 save_to_dir="3",
                                 save_prefix="generated",
                                 save_format=".png")):
    if i > total_number:
        break

结果:

当然,你可以改变datagen的参数,想法是用不同的参数对图像进行采样,所以CNN会正确标注3。

可能的问题 1: 为什么我不能 100% 确定问题出在颜色格式上?


答案:取决于您的 CNN 的准确性。如果您的 CNN 对 MNIST 的准确率介于 99.2% 和 99.8% 之间,那么使用 ImageGenerator 可以解决您的问题。

但是,如果 CNN 的准确率低于 99.2%,那么问题出在您的架构中,首先您需要在 MNIST 上达到或通过 99.2% 的阈值准确率。有关更多信息,请查看website

【讨论】:

    【解决方案2】:

    问题是硬限制设置为 0 和 255。避免使用地板除法(或改用一组逻辑语句)。利用除法并尝试从 145 向上的各种值。向上越多,输出中“白色”区域的厚度越小。

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2023-03-10
      • 1970-01-01
      • 2019-08-15
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多