【问题标题】:Downscale image for MNISTMNIST 的缩小图像
【发布时间】:2018-10-10 12:30:42
【问题描述】:

我正在尝试解决 Android 设备上的 MNIST 分类问题。我已经有一个训练有素的模型,现在我希望能够识别照片上的单个数字。

拍完照片后,我会进行一些预处理,然后再将图像传递给模型。 这是原始图像的示例:

之后我只把它变成黑白的,所以它开始看起来像这样:

请不要注意尺寸的变化 - 是我截屏的方式介绍的,在应用中两个图像仍然具有相同的大小。

将其转换为 BW 颜色后,我提取数字的 blob,将其缩小到 20*20(考虑纵横比),然后在周围添加填充以使其适合 MNIST 28*28 大小。最终结果如下:

请注意,我放大了图像以显示问题。问题如下:在缩小很多有用的信息之后会丢失。有时数字的整个边缘都消失了。有什么办法可以避免吗?也许我可以在缩小之前以某种方式使白线变粗?

附:我使用 Catalano 框架进行图像处理。

编辑应用建议的过滤器从答案后,我得到:

【问题讨论】:

    标签: java android image-processing bitmap mnist


    【解决方案1】:

    我不确定你提到的框架, 但在这里可以有所帮助的一件事是,在进行 MNIST 样式归一化之前,对原始图像使用一些形态学操作。 即,可以按如下方式进行erosion(我在python中记录了这种方法,您使用的框架中应该有类似物,因为操作非常标准)。

    import numpy as np
    import cv2
    
    xx = cv2.imread('6.jpg') # your original image of 6
    kernel = np.ones((20,20), np.uint8)
    erosion = cv2.erode(xx, kernel, iterations = 2)
    
    cv2.imwrite('6A.jpg',erosion) # this will be used as a replacement for the original image
    

    这将产生类似于this 的内容。然后,如果您对新图像进行二值化(例如灰度强度 150 的阈值),并在调整大小后进行填充,您应该会得到类似 this one 的东西,它更健壮。

    另请注意,在输入任何分类器之前,您需要在最后阶段(相对于其质心)集中图像。

    最终结果,在 MNIST 的标准中如下(物理尺寸 28x28)。

    【讨论】:

    • 我试试看。是的,我使用的框架中存在侵蚀过滤器。我以类似的方式思考,例如,试图模糊图像。但是我不知道很多图像处理操作,而且我也是在投射到 BW 图像之后进行的(这在我的情况下使模糊变得毫无意义)。
    • 你的例子中i.stack.imgur.com/r0KQp.png 是否仍然具有原始大小?
    • 我的示例中的第一张图像(侵蚀后)与您的尺寸相同。第二个是 28x28 并根据 MNIST 标准归一化(适合 20x20 框,并以 28x28 中的质心为中心)。它在帖子中的物理尺寸更大,因为我从我的 python 笔记本中复制了它,而不是在磁盘上写入实际文件。我现在将原始文件的链接放在答案中。
    • 这里应该足够的整个工作流程可能是这样的:1. 以灰度读取图像(未应用过滤器),2. 应用上述腐蚀,3. 通过以下方式对结果进行二值化使灰度强度高于 150 的所有像素为白色(= 255),低于 150 的所有像素为黑色(= 0)。 4.然后对步骤3的二值图像进行MNIST的归一化;这就是我得到最后 6 个答案的方式。
    • 我发现侵蚀至少在完整的 BW 图像上是相反的。 IE。使它更厚。但是,有一个膨胀过滤器,它完全符合您为 BW 图像演示的功能。目前我的管道如下:以灰度读取图像;应用自适应阈值 (Bradley);应用半径为 2 的变形;提取、添加填充、调整大小等。我还没有正确居中,但这是另一个问题。非常感谢!
    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2012-01-27
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多