J'essaye d'effectuer un filtre Médian sur une image en Java mais c'est terriblement lent. Premièrement, si l'un d'entre vous connaît une implémentation autonome, je pourrais l'utiliser serait fantastique si vous pouviez me le faire savoir. J'applique sur Android, en essayant de reproduire une petite partie de la JAI.Obtenir des octets à partir d'un int pour éviter les changements de bit - Java (Filtrage Médian)
Dans ma méthode, je prends chaque pixel, extraire la R, G & valeurs B à l'aide
r = pixel >> 16 & 0xFF
ou similaire, trouver la médiane pour le noyau et terminer avec
pixel = a | r <<16 | g << 8 | b
Y at-il façon que je peux saisir les octets d'un int de telle sorte que ce serait plus rapide?
Cordialement,
Gavin
EDIT: code complet pour aider à diagnostiquer mon manque de performance sur demande
Pour le fichier source réelle s'il vous plaît aller here c'est où ma mise en œuvre de filtre médian peut être trouvé.
largeur et hauteur variables sont de la taille de dest et sont disponibles en tant que variables membres de classe. Les pixels sont linéarisés en un tableau à une dimension.
private void medianFilterSquare(int[] source, int[] dest, int rWidth,
int rHeight, int radius) {
// Source has been reflected into a border of size radius
// This makes it radius * 2 pixels wider and taller than the dest
int r,g,b;
int destOffset, rOffset, kOffset;
// The first offset into the source to calculate a median for
// This corresponds to the first pixel in dest
int rFirst = radius + (rWidth*radius);
// We use a square kernel with the radius passed
int neighbours = (radius+radius+1)*(radius+radius+1);
int index;
// Arrays to accumulate the values for median calculation
int[] rs = new int[neighbours];
int[] gs = new int[neighbours];
int[] bs = new int[neighbours];
// Declaring outside the loop helps speed? I'm sure this is done for me
// by the compiler
int pixel;
// Iterate over the destination pixels
for(int x = 0; x < height; x++){
for(int y = 0; y < width; y++){
// Offset into destination
destOffset = x + (y * width);
// Offset into source with border size radius
rOffset = destOffset + rFirst + (y * (radius *2));
index = 0;
// Iterate over kernel
for(int xk = -radius; xk < radius ; xk ++){
for(int yk = -radius; yk < radius ; yk ++){
kOffset = rOffset + (xk + (rWidth*yk));
pixel = source[kOffset];
// Color.red is equivalent to (pixel>>16) & 0xFF
rs[index] = Color.red(pixel);
gs[index] = Color.green(pixel);
bs[index] = Color.blue(pixel);
index++;
}
}
r = medianFilter(rs);
g = medianFilter(gs);
b = medianFilter(bs);
dest[destOffset] = Color.rgb(r, g, b);
}
}
}
Le décalage de bits et des opérations logiques devraient être relativement rapide. Êtes-vous sûr que ce n'est pas le code entre ces deux lignes qui est le goulot d'étranglement? – colithium
Comment "trouvez-vous la médiane pour le noyau". Pouvons-nous voir le code? – Nosredna
En fait, vous n'êtes même pas nous montrer comment vous obtenez g, b, ou a. Pourquoi ne pas poster tout le code? – Nosredna