2017-04-02 3 views
2

Was ist die beste Methode, um ein Bitmap-Bild auf Android mit Java zu verkleinern, wenn das Ziel ist, die Qualität von Linien/Kanten so weit wie möglich zu erhalten? Die Absicht ist, diese herunterskalierten Bilder zu verwenden, um ein neurales Netzwerk zu trainieren.Android Bitmap Downscaling

Jedes Bild enthält ein einzelnes Zeichen (in diesem Fall Chinesisch). Das Bild unten zeigt das Originalbild, das auf einem vom Benutzer gezeichneten View-Objekt erstellt wurde. Mein Ziel ist es, dieses Bitmap-Bild auf eine Auflösung von 30 mal 30 Pixel zu verkleinern.

Ich verwende derzeit die Bitmap-Methode createScaledBitmap, frage mich aber, ob es Algorithmen/Methoden gibt, die für diese Art von Zeichen-Downscaling optimiert sind.

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

Ein weiterer Faktor könnte die Beziehung zwischen Linienbreite und Bildgröße insgesamt sein. Die Linienbreite beträgt derzeit 20f. Ich habe herausgefunden, dass ich bei 30f große dunkle Klumpen bekomme und bei 10f verliere ich viele Informationen, wenn ich herunterskaliere.

Ein weiterer Faktor könnte die resultierende Bildgröße sein. Wenn ich jedoch zu groß gehe, kann der Rechenaufwand für das Netzwerk zu groß werden.

Originalbild.

Original Image

Hier ist das verarbeitete Bild - es ist nicht so schlecht aussieht, aber ich mache mir Sorgen, mit anderen Charakteren, kann es nicht genug Variation für das neuronale Netz zu lernen.

Processed Image

Antwort

1

Eine erste Lösung, mir in den Sinn kam, war dieses Bild vektorisieren und dann wieder neu zu zeichnen. Sie haben geschrieben, dass das Bild von einem Benutzer gezeichnet wird, so dass Sie das Bild nicht vektorisieren müssen. Alles, was Sie tun müssen, ist, Benutzereingaben als eine Liste von Punkten zu speichern und sie in der gewünschten Skala zu reproduzieren (zeichnen).

Benutzer, eine Linie (10, 10)-(20, 10) auf Leinwand mit einer Größe Zeichnung 100 x 100 px, wird mit der Größe 30 x 30 px Linie von (3, 3) zu (6, 3) auf dem Vorschaubild sehen. Dann können Sie die Linienstärke auch in Abhängigkeit vom endgültigen Bildmaßstab einfach anwenden.

Natürlich sollten Sie für eine bessere Leistung einige Bitmaps generieren und zwischenspeichern, anstatt sie immer wieder neu zu zeichnen, wenn ein Benutzer sie anzeigt.