2016-04-25 4 views
1

Я пытаюсь получить преобразование журнала из серого изображения. Но с любым значением c я получаю черное изображение. Есть идеи?преобразование журнала изображений с изображением серого в java

, что мой метод:

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

общественного статический BufferedImage log_trans (ИНТ [] [] ImageData, ИНТ с) {

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

ответ

1

Похоже, что "RGB" всегда отрицательный, поэтому темп всегда Нан, поэтому в конце «rgb» после:

rgb = (int) (c * temp); 

всегда 0, и именно поэтому вы всегда получаете черную картинку.

После изменения 8-ю строчку в:

RGB = (((байт) RGB & 0xFF) < < 16) | (((байт) RGB & 0xFF) < < 8) | (((байт) rgb & 0xFF));

Я получаю очень темный выход, но это не очень приятно. Я тестировал значение «c» равным 1, 18000, 180000 и 0x00FFFFFF.

+0

@Jedzej: Спасибо. Я попробовал ваш код, и, как вы сказали, он работает только при очень высоких значениях c. Я уже сделал то, что вы предлагаете в моем методе чтения изображений. Может быть, это связано с моим методом чтения изображений? Я редактирую свой вопрос, добавляя метод чтения изображений. – Nazi

+1

Я только что запустил ваш код. После удаления строки: «rgb = (int) (c * temp)», «Я получил довольно красивое черно-белое изображение. Честно говоря, этот логарифм кажется подозрительным, не могли бы вы дать некоторое объяснение этому алгоритму? Я чувствую, что Math.log не следует применять ко всему значению rgb (так что триплет R, G и B), но для разделения значений R, G и B. Выполняете ли вы какой-то конкретный алгоритм? –

+1

Ух, хорошо, подожди. То, что вы передаете своей функции, уже серое изображение, то, что вы хотите сделать, это применить к нему логарифмическое преобразование. Хорошо. Вы должны применить логарифм к значению, считанному из массива, умножить на «c» и THEN распространить это значение на R, G и B (сдвинув начальное значение). Обратите внимание, что после log (rgb) * c вы можете легко получить значение больше 255, поэтому больше, чем вы можете поместить в один байт, поэтому вы должны, вероятно, закрепить это значение на 255, поэтому Math.min (rgb, 255), в противном случае вы получите почти случайные значения (последние байты некоторых более крупных значений), которые являются бессмысленными. –