Java MNIST的降尺度图像

Java MNIST的降尺度图像,java,android,image-processing,bitmap,mnist,Java,Android,Image Processing,Bitmap,Mnist,我试图解决Android设备上的MNIST分类问题。我已经有一个训练有素的模型了,现在我想能够识别照片上的一个数字 在拍摄完照片后,我进行了一些预处理,然后将图像传递给模型。 以下是原始图像的示例: 在那之后,我只把它做成黑白的,所以它开始看起来像这样: 请不要注意尺寸上的变化——这些图片是通过我截图的方式引入的,在应用程序中,两张图片的大小仍然相同 将其转换为BW颜色后,我提取数字的斑点,将其缩小到20*20(考虑纵横比),然后在周围添加填充,使其适合MNIST 28*28大小。最终结果如

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

在拍摄完照片后,我进行了一些预处理,然后将图像传递给模型。 以下是原始图像的示例:

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

请不要注意尺寸上的变化——这些图片是通过我截图的方式引入的,在应用程序中,两张图片的大小仍然相同

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

请注意,我放大了图像以显示问题。问题是:在缩小尺度后,许多有用的信息丢失了。有时数字的整个边缘都消失了。有什么办法可以避免吗?也许我可以在缩小尺寸之前让白线变粗

另外,我使用Catalano框架进行图像处理

编辑应用答案中的建议过滤器后,我得到以下结果:
我不确定你提到的框架, 但有一件事可以帮助我们,在进行MNIST风格的标准化之前,对原始图像使用一些形态学操作。 也就是说,可以按如下方式进行侵蚀(我用python记录了这种方法,在您使用的框架中应该有类似的方法,因为操作非常标准)

这将产生类似的结果。然后,如果你对新图像进行二值化(比如说灰度阈值为150),然后进行调整大小和填充,你应该得到类似的结果,这样更健壮

还要注意的是,在输入到任何分类器之前,您需要在最后一个阶段(相对于其重心)集中图像


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

我将尝试一下。是的,侵蚀过滤器存在于我使用的框架中。我的想法与此类似,例如,试图模糊图像。但是我不知道很多图像处理操作,我也在对BW图像进行转换后做了这些操作(在我的例子中,这使模糊变得毫无意义)。在你的例子中,我仍然保持原始大小,对吗?我的例子中的第一个图像(腐蚀后)的大小与你的相同。第二个是28x28,并根据MNIST标准进行规范化(安装在20x20框中,并以28x28中的质量中心为中心)。在文章中,它的物理尺寸更大,因为我从python笔记本中复制了它,而不是将实际文件写到磁盘上。现在,我将把原始文件的链接放在答案中。整个工作流程可能如下所示:1。读取灰度图像(未应用过滤器),2。按上述步骤3进行腐蚀处理。通过将灰度150以上的所有像素设置为白色(=255),将150以下的所有像素设置为黑色(=0),对结果进行二值化。4.然后对第3步的二值图像进行MNIST归一化处理;这就是我得到答案中最后6个的原因。我发现侵蚀至少在完整的BW图像上是相反的。也就是说,使它更厚。但是,有一个膨胀过滤器,它的作用与您为BW图像演示的完全相同。目前我的管道如下:读取灰度图像;应用自适应阈值(布莱德雷);应用半径为2的三角剖分;提取、添加填充、调整大小等。我还没有将其正确居中,但这是另一个问题。谢谢!
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