Sobel Kantenerkennung in Android

8

Als Teil einer Anwendung, die ich für Android entwickle, möchte ich dem Benutzer eine vom Rand erkannte Version eines Bildes zeigen, das er gemacht hat (ähnlich wie im Beispiel unten).

Um dies zu erreichen, habe ich mir den Sobel-Operator angeschaut und wie er ihn in Java implementiert. Viele der Beispiele, die ich gefunden habe, verwenden jedoch Objekte und Methoden, die in AWT gefunden werden ( wie dieses Beispiel ) das ist nicht Teil von Android.

Meine Frage ist dann wirklich, bietet Android Alternativen zu den Funktionen von AWT, die im obigen Beispiel verwendet wurden? Wenn wir das Beispiel nur mit den in Android integrierten Bibliotheken umschreiben würden, wie würden wir dann vorgehen?

    
greenie 30.05.2010, 11:43
quelle

4 Antworten

3

Da Sie BufferedImage in Android nicht haben, können Sie alle grundlegenden Operationen selbst durchführen:

%Vor%

Wie Sie sehen können, deckt dies fast alles ab, was Sie für die Portierung dieses AWT-Beispiels benötigen. (Ändern Sie einfach die 'convolvePixel' Funktion)

    
reflog 30.05.2010, 14:32
quelle
5

Die Frage und die Antwort sind 3 Jahre alt ... @ reflogs Lösung funktioniert für eine einfache Aufgabe wie Kantenerkennung, aber es ist langsam.

Ich verwende GPUImage unter iOS für die Kantendetektion. Es gibt eine äquivalente Bibliothek auf Android: Ссылка

Es ist hardwarebeschleunigt, also sollte es sehr schnell sein. Hier ist der Sobel-Kantenerkennungsfilter: Ссылка

Laut dem Dokument können Sie das einfach tun:

%Vor%

Eine weitere Möglichkeit ist RenderScript, mit dem Sie auf jedes Pixel parallel zugreifen und damit alles machen können, was Sie wollen. Ich sehe dafür noch keine Bildverarbeitungsbibliothek.

    
x.y 20.06.2013 22:20
quelle
0

Überprüfen Sie eine Java-Implementierung hier:

Zypern

Es besteht keine Abhängigkeit von Swing / AWT oder einer anderen Bibliothek. Es arbeitet direkt auf den Bildpixeln und es ist schnell.

Die Ergebnisse können hier eingesehen werden (scroll down):

Ссылка

    
flanglet 26.05.2013 05:07
quelle
0

Eine weitere Option ist die Verwendung von OpenCV, die eine großartige Implementierung für Android hat.

Die Methode Imgproc.Sobel() verwendet ein Bild in Form eines Mat-Typs, der einfach aus einer Ressource oder Bitmap geladen werden kann. Die Eingabe Mat sollte ein Graustufenbild sein, das auch mit opencv erstellt werden kann. Mat src = Highgui.imread(getClass().getResource( "/SomeGrayScaleImage.jpg").getPath());

Führen Sie dann den Sobel-Kantendetektor darauf und speichern Sie die Ergebnisse in einer neuen Mat. Wenn Sie die gleiche Bildtiefe beibehalten möchten, dann wird dies ... Mat dst; int ddepth = -1; // destination depth. -1 maintains existing depth from source int dx = 1; int dy = 1; Imgproc.Sobel(src, dst, ddepth, dx, dy);

Einige Referenzdokumente finden Sie hier: Ссылка

Für ein in Android Studio erstelltes Gerät können Sie die für Java erstellte opencv-Bibliothek von verschiedenen Orten aus aufrufen, aber ich hosten auch einen aktuellen Build. In Ihrer build.gradle-Datei können Sie eine Abhängigkeit wie folgt hinzufügen ... Ansonsten ist es ein wenig schwierig. %Code% Wenn Sie Eclipse verwenden, finden Sie auf der Opencv-Website weitere Informationen zur Verwendung von Opencv unter Android: Ссылка

    
Buddhisthead 24.08.2015 04:46
quelle