Python 处理图像作为mnist模型的输入

Python 处理图像作为mnist模型的输入,python,image,opencv,image-processing,mnist,Python,Image,Opencv,Image Processing,Mnist,我有一个图像,我需要从中检测数字。我已经开发了一个同样的CNN模型。但是因为我的图像是不同的颜色格式(不同于mnist输入,它在黑色背景中是白色的),所以我需要适当地处理我的图像 这是输入图像。我需要将其转换为黑色背景下的白色,这样我就可以通过我的模型来检测数字3 我尝试从图像中删除边框,然后反转颜色以生成所需格式的图像 到目前为止,我的代码是: 导入cv2 将matplotlib.pyplot作为plt导入 img_name='input.png' image=cv2.imread(img\

我有一个图像,我需要从中检测数字。我已经开发了一个同样的CNN模型。但是因为我的图像是不同的颜色格式(不同于mnist输入,它在黑色背景中是白色的),所以我需要适当地处理我的图像

这是输入图像。我需要将其转换为黑色背景下的白色,这样我就可以通过我的模型来检测数字
3

我尝试从图像中删除边框,然后反转颜色以生成所需格式的图像

到目前为止,我的代码是:

导入cv2
将matplotlib.pyplot作为plt导入
img_name='input.png'
image=cv2.imread(img\u名称,cv2.imread\u灰度)
灰色=cv2。调整大小(图像,(256256))
结果=灰色[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:

我想从图像中正确删除边框。在某些情况下,当我使用我的代码尝试时,图像也被裁剪掉,或者边框仍然存在


出现更多图像

问题在于硬限制设置为0和255。避免楼层划分(或者使用一组逻辑语句)。使用除法并尝试从145向上的各种值。越往上走,输出中“白色”区域的厚度越小。

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

导入cv2
img=cv2.imread(“gHeKR.png”)
灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
反向=255-灰色
imwrite(“inversed.png”,cv2.resize(inversed,(256,256)))
结果:

但是,这个问题可能不仅仅通过
图像处理

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

对于卷积层,图像颜色格式不应该是一个问题

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

例如:

从keras.preprocessing.image导入加载\u img、img\u到\u数组
从keras.preprocessing.image导入ImageDataGenerator
#生成的总数
总数=5
数据生成=ImageDataGenerator(重缩放=1./255,剪切范围=0.2,
缩放范围=0.2,水平翻转=真)
#创建图像到张量
img=load\u img(“3/3.png”,灰度=True)
arr=img_到_阵列(img)
张量图像=arr.reshape((1,)+arr.shape)
对于i,在枚举(数据生成流(x=张量图像,
批次大小=1,
保存到\u dir=“3”,
保存前缀=“已生成”,
保存格式=“.png”):
如果i>总数量:
打破
结果:

当然,您可以更改
datagen
的参数。这个想法是使用不同的参数对图像进行采样,因此CNN将正确标记3

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


答:取决于你的CNN的准确性。如果您的CNN对MNIST的准确率在99.2%到99.8%之间,则使用
图像生成器
解决您的问题


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

的信息,您可以尝试对灰度图像进行阈值化,以便获得更细的字符。你也可以裁剪得更好一些,这样3的底部就不会被裁剪掉。你也可以在你的白色3上使用形态学腐蚀来减薄它,或者使用形态学做一些更适当的减薄。也许看看骨架化:骨架化将把你所有的字符转换成一行1像素宽(厚),如果你想“正常化”,这可能会很有用“所有斑点的厚度。”埃尔德斯格拉齐亚多是的,骨骼化只是故事的一半。我可能会使用一些扩张来稍微增加笔划的厚度。或者更好的方法是使用距离变换,任何超出DT产生的最大值一定百分比的像素都将保留。这将导致数字比骨骼化版本稍厚。你为什么坚持切割边缘?除了在最后一步后进行简单的腐蚀外,这将使探测器更容易区分正确的数字。