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;
}
@Jedzej:ありがとう。私はあなたのコードを試して、あなたが言ったように、それはちょうど非常に高い値のcで動作します。私はあなたの読書イメージメソッドであなたが提案していることをすでに行っています。これは私のイメージ読書メソッドに関連するかもしれませんか?画像の読み取り方法を追加して私の質問を編集しています。 – Nazi
私はあなたのコードを実行しました。行を削除した後: "rgb =(int)(c * temp);"かなり良い白黒画像が得られました。正にこの対数は疑わしいと思われますが、あなたはこのアルゴリズムにいくつかの説明を提供できますか?私はMath.logをRGBの値(R、G、Bの三つ組)に適用するのではなく、R、G、Bの値を分けるべきだという気持ちがあります。 –
うん、さて、ちょっと待ってください。あなたの関数に渡すものはすでに灰色の画像です。あなたがしたいのは、対数変換を適用することです。はい。配列から読み取った値に対数をかけ、cを乗算し、THENはこの値をR、G、Bに(初期値をずらして)広げる必要があります。 log(rgb)* cの後では、255より大きい値を簡単に得ることができるので、1バイトに入れることができるので、おそらくこの値を255に固定する必要があるので、Math.min(rgb、255)さもなければ、無意味な値に近いランダムな値(より大きな値の最後のバイト)が得られます。 –