缩小 MNIST 图像规模

3
我正在尝试解决Android设备上的MNIST分类问题。我已经有了一个训练好的模型,现在我想能够识别照片上的单个数字。
拍摄照片后,在将图像传递给模型之前,我会进行一些预处理。以下是原始图像的示例: enter image description here 然后,我将其变为黑白色,使其开始看起来像这样: enter image description here 请不要关注尺寸上的变化-它们是由于我截取屏幕造成的,在应用程序中,两个图像仍具有相同的大小。
将其转换为黑白色后,我提取数字的斑点,将其缩小到20*20(保持纵横比),然后添加填充以使其适合MNIST 28*28的大小。最终结果如下:

enter image description here

请注意,我将图像放大以显示问题。问题是:缩小后会丢失很多有用的信息,有时整个数字的边缘都会消失。有没有办法避免这种情况?也许我可以在缩小之前使白线变粗?
附注:我使用Catalano框架进行图像处理。
编辑:应用答案中建议的滤镜后,这是我的结果:enter image description here
1个回答

3

我不确定你提到的框架,但是有一个可以帮助你的事情,就是在进行MNIST样式的归一化之前,在原始图像上使用一些形态学操作。具体来说,可以按以下方式进行腐蚀(我记录了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

这将会生成类似这样的图片。然后,如果您对新图像进行二值化(例如用灰度强度150进行阈值处理),并进行缩放后再填充,您应该会得到这样一个更具鲁棒性的图片。
另外请注意,在将图片提供给任何分类器之前,您需要在最后一步将其居中(相对于其质心)。
MNIST标准下的最终结果如下所示(物理尺寸为28x28)。

我会试一下。是的,我使用的框架中存在腐蚀滤波器。我也是这样想的,例如尝试模糊图像。但是我不太了解许多图像处理操作,并且我在将其转换为黑白图像后进行了模糊处理(在我的情况下使得模糊处理没有意义)。 - Lingviston
你的意思是在你的例子中 https://i.stack.imgur.com/r0KQp.png 仍然保持原始大小吗? - Lingviston
1
整个工作流程如下:1. 以灰度模式读取图像(不应用任何过滤器),2. 应用上述的腐蚀操作,3. 通过将所有灰度强度大于150的像素设为白色(=255),所有灰度强度小于150的像素设为黑色(=0)来进行二值化处理。4. 然后对步骤3中的二进制图像进行MNIST的标准化处理;这就是我得到答案中的最后一个数字6的方法。 - Hayk
我发现腐蚀至少在完整的黑白图像上是相反的。也就是说,它会使其变厚。但是,有一个膨胀滤镜,可以对黑白图像进行您演示的操作。目前我的流程如下:以灰度读取图像;应用自适应阈值(Bradley);使用半径为2的膨胀;提取、添加填充、调整大小等。我还没有正确地居中它,但这是另一个问题。非常感谢! - Lingviston
好的。我只是提到膨胀操作,以便于其他有类似问题的人参考。 - Lingviston
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接