J'essaye d'obtenir une transformation de notation d'une image grise. Mais avec n'importe quelle valeur c j'obtiendrai une image noire. Une idée?transformation de log d'image grise en java
qui est ma méthode:
/// ---------------------------------- -----------------
BufferedImage public static log_trans (int [] [] imageData, int c) {
BufferedImage LogImage = new BufferedImage(imageData.length, imageData[0].length, BufferedImage.TYPE_BYTE_GRAY);
double temp;
for (int i =0 ; i<imageData.length ; i ++){
for (int j=0 ; j<imageData[0].length ; j++){
int rgb = imageData[i][j];
rgb = (rgb<<16)|(rgb<<8)|(rgb);
temp = Math.log10(rgb+1);
rgb = (int) (c * temp);
LogImage.setRGB(i, j, rgb);
}}
return LogImage;
}
--------------------------------------------------------------
public static int[][] readimage(File filename){
BufferedImage img;
try {
img = ImageIO.read(filename);
// Gray_scaled Image output
int width = img.getWidth();
int height = img.getHeight();
ImagePro.fw=width;
ImagePro.fh = height;
int [][] readimageVal = new int [width][height];
for (int i = 0; i<height ; i++){
for (int j =0 ; j<width ; j++){
Color c = new Color(img.getRGB(j, i));
int r= (int)(c.getRed() * 0.299)&0xff;
int g = (int)(c.getGreen() * 0.587)&0xff;
int b = (int)(c.getBlue() *0.114)&0xff;
int avg = ((r+b+g));
readimageVal[j][i] = avg;
}
}
return readimageVal;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Jedzej: Merci. J'ai essayé votre code et comme vous l'avez dit, il fonctionne uniquement pour les valeurs très élevées de c. J'ai déjà fait ce que vous suggérez dans ma méthode d'image de lecture. Est-ce que ceci peut être lié à ma méthode de lecture d'image? Je suis en train d'éditer ma question en ajoutant une méthode de lecture d'image. – Nazi
Je viens de lancer votre code. Après avoir enlevé la ligne: "rgb = (int) (c * temp);" J'ai une jolie image en noir et blanc. Pour être honnête, ce logarithme semble suspect, pourriez-vous fournir quelques explications à cet algorithme? J'ai le sentiment que Math.log ne devrait pas être appliqué à toute la valeur rgb (donc triplet R, G et B), mais à séparer les valeurs de R, G et B. Implémentez-vous un algorithme spécifique? –
Ugh, d'accord, attendez un moment. Ce que vous passez à votre fonction est déjà une image grise, ce que vous voulez faire est d'y appliquer une transformation logarithmique. D'accord. Vous devez appliquer le logarithme à la valeur lue dans un tableau, multiplier par "c" et ensuite étendre cette valeur en R, G et B (en décalant la valeur initiale). Notez que, après log (rgb) * c, vous pouvez facilement obtenir une valeur supérieure à 255, donc plus que vous ne pouvez mettre en octet unique, donc vous devriez probablement fixer cette valeur à 255, donc Math.min (rgb, 255), sinon, vous obtiendrez des valeurs presque aléatoires (derniers octets de certaines valeurs plus grandes), ce qui est absurde. –