2017-04-02 87 views
2

如果目标是尽可能保持线条/边缘的质量,那么使用Java缩放Android上的位图图像的最佳方法是什么?目的是使用这些缩小的图像来训练神经网络。Android Bitmap降尺寸

每个图像将包含一个字符(在本例中为中文)。下图显示了由用户绘制的View对象上生成的原始图像。我的目标是将此位图图像缩小为30 x 30像素的分辨率。

我目前正在使用位图createScaledBitmap方法,但我想知道是否有任何算法/方法优化这种字符缩小。

drawView.buildDrawingCache(); 
Bitmap b = Bitmap.createScaledBitmap(drawView.getDrawingCache(), 30, 30, false); 
saveImage(b); // Saves image to disk. 
drawView.destroyDrawingCache(); 

另一个因素可能是线宽和整体图像尺寸之间的关系。线宽目前为20f。我已经发现,在30f时,我开始出现大的黑暗块,而在10f时,当我缩小比例时,我失去了很多信息。

还有另一个因素可能导致图像大小。但是,如果我变得太大,那么训练网络所需的计算量可能会变得太大。

Original image。

Original Image

这里是处理后的图像 - 它看起来并不太坏,但我担心与其他字符,也可能没有足够的变化对神经网络学习。

Processed Image

回答

1

第一种方案,进入我的脑海里是矢量化这个图像,然后再重新绘制。你写这个图像是由用户绘制的,所以你甚至不需要矢量化图像。您只需将用户输入保存为点列表并按照所需的比例重现(绘制)它即可。

用户,绘制从(10, 10)一行(20, 10)上帆布与大小100 x 100 px,将看到从线到(3, 3)(6, 3)缩略图大小为30 x 30 px。然后,您还可以根据最终图像比例轻松应用线条粗细。

当然,为了获得更好的性能,您应该生成并缓存一些位图,而不是在用户显示它们时再次绘制它们。