Sobel Détection de contours dans Android
Dans le cadre d'une application que je suis en développement pour Android, je voudrais montrer à l'utilisateur un avantage sur la version détectée d'une image qu'ils ont pris (quelque chose de similaire à l'exemple ci-dessous).
Pour réaliser cela, j'ai été à la recherche à l'opérateur de Sobel et comment la mettre en œuvre en Java. Cependant, de nombreux exemples que j'ai trouvé à faire usage de méthodes et objets trouvés dans AWT (comme cet exemple) qui n'est pas partie d'Android.
Ma question est alors vraiment, ne Android de fournir des solutions de rechange aux caractéristiques de l'AWT qui ont été utilisés dans l'exemple ci-dessus? Si nous étions à la réécriture de cet exemple, juste en utilisant les bibliothèques intégré dans Android, comment pourrions-nous le faire?
N'est-ce pas une classe BufferedImage trouvé dans AWT?
OriginalL'auteur greenie | 2010-05-30
Vous devez vous connecter pour publier un commentaire.
puisque vous n'avez pas BufferedImage dans Android, vous pouvez faire toutes les opérations de base vous-même:
comme vous pouvez le voir, ce qui couvre presque tout ce dont vous avez besoin pour le portage qui AWT exemple. (il suffit de changer le " convolvePixel fonction)
Vous avez raison, de l'extraction de l'ensemble du tableau est plus rapide. Pour effectuer des circonvolutions sur le tableau, vous venez d'effectuer une itération en utilisant le même type de boucles for et obtenir la valeur du pixel en utilisant soit séparé de R,G et B de canaux ou de la rédaction d'un pixel de RVB tableau à l'aide de
Color.rgb(r1,g1,b1)
fonction.OriginalL'auteur reflog
La question et la réponse de 3 ans... @reflog la solution fonctionne pour une tâche simple, comme la détection de contours, mais c'est lent.
- Je utiliser GPUImage sur iOS pour la détection des contours de la tâche. Il y a un équivalent de la bibliothèque sur Android:
https://github.com/CyberAgent/android-gpuimage/tree/master
Il est accéléré par le matériel de sorte qu'il est censé être très rapide. Voici la sobel bord de filtre de détection:
https://github.com/CyberAgent/android-gpuimage/blob/master/library/src/jp/co/cyberagent/android/gpuimage/GPUImageSobelEdgeDetection.java
Selon la doc, vous pouvez simplement faire ceci:
Une autre option est d'utiliser RenderScript, auquel vous pouvez accéder à chaque pixel en parallèle et faire ce que vous voulez avec elle. Je ne vois pas de librairie de traitement d'image intégré avec encore.
OriginalL'auteur x.y
Vérifier une implémentation de java ici:
http://code.google.com/p/kanzi/source/browse/java/src/kanzi/filter/SobelFilter.java
Il n'y a pas de dépendance sur Swing/AWT ou toute autre bibliothèque. Il agit directement sur les pixels de l'image et il est rapide.
Les résultats peuvent être vus ici (en bas):
http://code.google.com/p/kanzi/wiki/Overview
OriginalL'auteur flanglet
Une autre option est d'utiliser OpenCV, qui a une grande application pour Android.
La
Imgproc.Sobel()
méthode prend une image sous la forme d'un "Tapis" de type, qui est facilement chargé à partir d'une ressource ou bitmap. L'entrée Tapis doit être d'une image en niveaux de gris, qui peut également être créée avec opencv.Mat src = Highgui.imread(getClass().getResource(
"/SomeGrayScaleImage.jpg").getPath());
Puis exécutez sobel détecteur de bord sur elle, l'enregistrement des résultats dans un nouveau Tapis. Si vous voulez garder la même image de profondeur, puis ce sera le faire...
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);
Certains documentation de référence est ici:
http://docs.opencv.org/java/org/opencv/imgproc/Imgproc.html#Sobel(org.opencv.core.Mat,%20org.opencv.core.Mat,%20int,%20int,%20int)
Pour un build gradle dans Android Studio, vous pouvez tirer dans la bibliothèque opencv construit pour Java à partir de différents endroits, mais j'ai aussi l'hôte d'une version récente. Dans votre construction.gradle fichier, vous pouvez ajouter une dépendance comme si... Sinon, c'est un peu délicat.
dependencies {
compile 'com.iparse.android:opencv:2.4.8'
}
Si vous utilisez Eclipse, vous pouvez vérifier la Opencv site web pour plus de détails sur l'utilisation d'Opencv sur Android: http://opencv.org/platforms/android.html
OriginalL'auteur Buddhisthead