2016-04-25 2 views
1

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; 
} 

Répondre

1

Il semble que "rgb" est toujours négatif, donc la température est toujours Nan, donc à la fin "rgb" après:

rgb = (int) (c * temp); 

est toujours 0 et c'est pourquoi vous obtenez toujours une image noire.

Après avoir changé votre 8e ligne:

rgb = (((octet) rgb & 0xFF) < < 16) | (((octet) rgb & 0xFF) < < 8) | (((octet) rgb & 0xFF));

Je reçois une sortie très sombre, mais ce n'est pas très agréable. J'ai testé pour la valeur de "c" étant 1, 18000, 180000 et 0x00FFFFFF.

+0

@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

+1

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? –

+1

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. –