如果目标是尽可能保持线条/边缘的质量,那么使用Java在Android上缩小位图图像的最佳方法是什么?目的是使用这些缩小的图像来训练神经网络。
每个图像都包含一个字符(在本例中为中文)。下图显示了用户绘制的View对象上生成的原始图像。我的目标是将此位图图像缩小到30 x 30像素的分辨率。
我目前正在使用Bitmap createScaledBitmap方法,但我想知道是否有任何算法/方法可以优化这种字符缩减。
drawView.buildDrawingCache();
Bitmap b = Bitmap.createScaledBitmap(drawView.getDrawingCache(), 30, 30, false);
saveImage(b); // Saves image to disk.
drawView.destroyDrawingCache();
另一个因素可能是线宽和图像尺寸之间的关系。线宽目前是20f。我发现在30f时,我开始得到大的暗团,在10f时,我在缩小时会丢失很多信息。
另一个因素可能是图像尺寸。但是,如果我太大,那么训练网络所需的计算量可能会变得太大。
原始图片。
这是经处理的图像 - 看起来并不太糟糕,但我担心其他角色,可能没有足够的变异供神经网络学习。
答案 0 :(得分:1)
我想到的第一个解决方案是对图像进行矢量化,然后重新绘制它。您写道,该图像是由用户绘制的,因此您甚至不需要对图像进行矢量化。您需要做的就是将用户输入保存为点列表,并以所需的比例重现(绘制)。
用户在尺寸为(10, 10)
的画布上从(20, 10)
到100 x 100 px
画一条线,在尺寸为{的缩略图上会看到(3, 3)
到(6, 3)
的一行{1}}。然后,您还可以根据最终图像比例轻松应用线条粗细。
当然,为了获得更好的性能,您应该生成并缓存一些位图,而不是在用户显示它们时反复绘制它们。