3x3,5x5,7x7マトリックスのJavaでガウスブラーを実装する必要があります。私が間違っている場合、あなたは私を修正することができますJava:ガウスブラーの実装
私は行列(M)3×3(中央値はM(0、0))しました:
1 2 1 2 4 2 1 2 1
を、私は1つのピクセルを取ります(P)画像から、それぞれ最も近い画素について:
s = M(-1, -1) * P(-1, -1) + M(-1, 0) * P(-1, 0) + ... + M(1, 1) * P(1, 1)
アン次いで分割してマトリックスの合計値:
P'(i, j) = s/M(-1, -1) + M(-1, 0) + ... + M(1, 1)
これは私のプログラムが行うすべてのことです。私は極端なピクセルを変更しないままにします。
私のプログラム:
for(int i = 1; i < height - 1; i++){
for(int j = 1; j < width - 1; j++){
int sum = 0, l = 0;
for(int m = -1; m <= 1; m++){
for(int n = -1; n <= 1; n++){
try{
System.out.print(l + " ");
sum += mask3[l++] * Byte.toUnsignedInt((byte) source[(i + m) * height + j + n]);
} catch(ArrayIndexOutOfBoundsException e){
int ii = (i + m) * height, jj = j + n;
System.out.println("Pixels[" + ii + "][" + jj + "] " + i + ", " + j);
System.exit(0);
}
}
System.out.println();
}
System.out.println();
output[i * width + j] = sum/maskSum[0];
}
}
私はこのようなBufferedImage
からsource
を得る:
int[] source = image.getRGB(0, 0, width, height, null, 0, width);
結果がこれです
私には、私のプログラムで何が問題なのですか?
彼らの宣言? Byte.toUnsignedInt((byte)source [(i + m)* height + j + n])でバイトへの変換を行っているため、カラー画像がピクセルを1バイトに収めるとは思えません。切り捨てによって最大255の値が得られます。これは、3バイト/サンプルのRGBカラースペースに変換された場合、結果が青(RおよびG成分が欠けている)の理由が説明されます。 –
'int [] source = image.getRGB(0、0、width、height、null、0、width);' '出力 'は' source'のコピーですので、3回フィルタリングする必要がありますか? RとGについて?どうしたらいいですか? – Wiszen
r、g、bの値を個別に取得するには、(ColorModel)[https://docs.oracle.com/javase/7/docs/api/java/awt/image/ColorModel。html] データがどのように格納されているか知っていれば、そのピクセルのint値から4バイトを抽出できます。 –