2016-04-25 3 views
1

Ich versuche, eine Protokollumwandlung von einem grauen Bild zu erhalten. Aber mit welchem ​​c-Wert bekomme ich ein schwarzes Bild. Irgendeine Idee?graue Bildprotokollumwandlung in Java

das ist meine Methode:

/// ---------------------------------- -----------------

public static BufferedImage 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; 
} 

Antwort

1

Es scheint, dass "rgb" ist immer negativ, also Temp ist immer Nan, also am Ende "rgb" nach:

rgb = (int) (c * temp); 

ist immer 0 und deshalb bekommst du immer ein schwarzes Bild.

Nach der 8. Zeile an veränderte:

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

Ich bekomme eine sehr dunkle Ausgabe, aber es ist nicht sehr nett. Ich habe getestet, ob der Wert von "c" 1, 18000, 180000 und 0x00FFFFFF ist.

+0

@Jedzej: Danke. Ich habe deinen Code ausprobiert und wie du sagtest, funktioniert es nur für sehr hohe Werte von c. Ich habe bereits getan, was Sie in meiner Lesebildmethode vorschlagen. Darf das mit meiner Bildlesemethode zusammenhängen? Ich bearbeite meine Frage, indem ich Bildleseverfahren hinzufüge. – Nazi

+1

Ich habe gerade Ihren Code ausgeführt. Nach dem Entfernen der Zeile: "rgb = (int) (c * temp);" Ich habe ziemlich schönes Schwarz-Weiß-Bild. Um ehrlich zu sein, scheint dieser Logarithmus verdächtig zu sein, könnten Sie diesem Algorithmus etwas erklären? Ich habe das Gefühl, dass Math.log nicht auf den ganzen rgb-Wert angewendet werden sollte (also Triplett R, G und B), sondern auf die Werte von R, G und B zu setzen. Implementieren Sie einen bestimmten Algorithmus? –

+1

Ugh, okay, warte einen Moment. Was Sie an Ihre Funktion übergeben, ist bereits ein graues Bild, was Sie tun möchten, ist logarithmische Transformation darauf anzuwenden. Okay. Sie müssen den Logarithmus auf den von einem Array gelesenen Wert anwenden, mit "c" multiplizieren und DANN diesen Wert in R, G und B verteilen (durch Verschieben des Anfangswerts). Beachten Sie, dass Sie nach log (rgb) * c leicht Werte größer als 255 erhalten können, also mehr, als Sie in ein einzelnes Byte schreiben können. Daher sollten Sie diesen Wert wahrscheinlich auf 255 beschränken, also Math.min (rgb, 255), Andernfalls erhalten Sie fast zufällige Werte (letzte Bytes einiger größerer Werte), die unsinnig sind. –