2017-04-02 92 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。然後,您還可以根據最終圖像比例輕鬆應用線條粗細。

當然,爲了獲得更好的性能,您應該生成並緩存一些位圖,而不是在用戶顯示它們時再次繪製它們。