2016-04-25 7 views
1

グレー画像からログ変換を取得しようとしています。しかし、どんなc値であれ、私は黒い画像を得るでしょう。何か案が?グレー画像ログ変換in java

私の方法です:

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

パブリック静的バッファ画像log_trans {

 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

([] []画像データ、INT C INT)をそれが "RGB" と思わ常に負であるため、tempは常にNanであるため、最後の "rgb"には次のようになります。

rgb = (int) (c * temp); 

は常に0なので、常に黒い画像が表示されます。

にあなたの第八行を変更した後:

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より大きい値を簡単に得ることができるので、1バイトに入れることができるので、おそらくこの値を255に固定する必要があるので、Math.min(rgb、255)さもなければ、無意味な値に近いランダムな値(より大きな値の最後のバイト)が得られます。 –

関連する問題