Java flou de l'Image
Je suis en train de flou de l'image
int radius = 11;
int size = radius * 2 + 1;
float weight = 1.0f / (size * size);
float[] data = new float[size * size];
for (int i = 0; i < data.length; i++) {
data[i] = weight;
}
Kernel kernel = new Kernel(size, size, data);
ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
//tbi is BufferedImage
BufferedImage i = op.filter(tbi, null);
Il sera flou de l'image, mais pas tous partie de l'image.
Où je suis absent de sorte qu'il sera flou de l'image. Sans aucun chemin .
- Que faire si vous remplacez
int size = radius * 2 + 1;
avec les valeurs réelles et de voir si la modification de cette valeur change les troubles de la boîte? - Voir la section
Working on the Edge
dans cet article pour une solution de contournement. Vous avez besoin d'augmenter la taille de votre image par rapport au noyau de la taille.
Vous devez vous connecter pour publier un commentaire.
Java standard
ConvolveOp
a seulement deux optionsEDGE_ZERO_FILL
etEDGE_NO_OP
. Ce que vous voulez, c'est les options de la JAI équivalent (ConvolveDescriptor), qui estEDGE_REFLECT
(ouEDGE_WRAP
, si vous voulez répéter les motifs).Si vous ne souhaitez pas utiliser JAI, vous pouvez mettre en œuvre vous-même, par la copie de votre image pour une image plus grande, l'étirement ou à envelopper les bords, appliquer la convolution de l'op, puis couper les bords (similaire à la technique décrite dans le "groupe de Travail sur le Bord de la" section de l'article posté par @halex dans la section des commentaires, mais selon cet article, vous pouvez aussi tout simplement laisser les bords transparents).
Pour des raisons de simplicité, vous pouvez simplement utiliser mon application appelée
ConvolveWithEdgeOp
qui ne le ci-dessus (licence BSD).Le code sera similaire à ce que vous aviez à l'origine:
Le filtre devrait fonctionner comme n'importe quel autre
BufferedImageOp
, et devrait fonctionner avec tous lesBufferedImage
.BufferedImage
.C'est parce que vous êtes à l'aide de
ConvolveOp.EDGE_NO_OP
dans cette ligne:La La documentation de l'API dit:
Essayer
EDGE_ZERO_FILL
- qui vous donnera des bordures noires.Vous pouvez également essayer de couper les bords après le flou.
La raison pour laquelle il ne peut pas faire les bords a à voir avec la façon dont fonctionne l'algorithme.
EDGE_ZERO_FILL
il y aura une bordure noire autour de la partie floue, qui restera le même qu'avec lesEDGE_NO_OP
.Vous pouvez utiliser opencv bibliothèque pour s'achever le flou de l'image.
Vous ne pouvez pas le flou d'un pixel. Ceci semble évident, mais quand vous pensez à ce sujet, quel est le minimum? Le flou d'un pixel, vous avez besoin des pixels voisins.
Le problème ici est que sur les bords et les coins, les pixels ont trop peu de voisins – le flou algorith a trop peu de pixels à utiliser. Il n'a pas de pixels "en dehors de" l'image qui a de flou, donc elle va juste laisser celles-est.
La solution est soit de prolonger l'image en quelque sorte (avez-vous une source plus importante de l'image?), ou couper le non-floue bits lorsque vous avez terminé. Les deux sont essentiellement les mêmes.
J'ai trouvé cette fois quand j'étais à la recherche d'un flou de capacité pour les documents lors de la ConvolveOp classe n'a pas le couper (pour les raisons que vous rencontrez). Il fait un flou Gaussien qui est le plus naturel de flou à mon humble avis... j'espère que ça va vous aider. J'ai récupéré à partir de cette page: Java De Traitement De L'Image...
Si vous avez souvent affaire avec des photos dans votre application, vous pouvez envisager d'utiliser le ImageJ API: Il packs de fonctionnalités sur un grand nombre de tâches de traitement d'image, y compris l'effet de flou.
Leur Flou Gaussien filtre de flou à droite sur le bord de l'image, en faisant l'hypothèse suivante
Même si vous ne voulez pas changer votre code pour utiliser la ImageJ API, vous pouvez toujours trouver l'hypothèse ci-dessus utiles à la résolution de votre problème.
Pour plus d'info, consultez le GaussianBlur filtre dans la documentation de l'API:
http://rsb.info.nih.gov/ij/developer/api/ij/plugin/filter/GaussianBlur.html