最近畳み込みフィルターについて読んだことがあります。私はイメージをぼかすコードを作りたがったが、それが明るくなっている。私はしばらくの間私のコードを見てきましたが、間違いを見つけることはできません。誰でも助けてくれますか?畳み込みブラーフィルターが機能せず、画像が明るくなります
は、ここに私のコードです:
final static int filterHeight =3;
final static int filterWidth = 3;
static double filter[][] = new double[][]{
{1,1,1},
{1,1,1},
{1,1,1}
};
public static void main(String[] args) {
BufferedImage img;
BufferedImage result;
try
{ File in = new File("in.jpg");
File out = new File("out.jpg");
img = ImageIO.read(in);
Color[][] pixels = new Color[img.getWidth()][img.getHeight()];
for(int i=0;i<img.getWidth();i++){
for(int j=0;j<img.getHeight();j++){
pixels[i][j]=new Color(img.getRGB(i,j),true);
}
}
result = new BufferedImage(img.getWidth(), img.getHeight(), img.getType());
for(int x=0;x<img.getWidth();x++){
for(int y=0;y<img.getHeight();y++){
int r=0,g=0,b=0;
for(int i=0;i<filterWidth;i++){
for(int j=0;j<filterHeight;j++){
int imageX = (int)(x - filterWidth/2 + i + img.getWidth()) % img.getWidth();
int imageY = (int)(y - filterHeight/2 + j + img.getHeight()) % img.getHeight();
if(imageX<0 || imageY<0) System.out.println("ERROR: "+imageX+" "+imageY);
r+=pixels[imageX][imageY].getRed()*filter[i][j];
g+=pixels[imageX][imageY].getGreen()*filter[i][j];
b+=pixels[imageX][imageY].getBlue()*filter[i][j];
}
if(r>255) r=255;
if(r<0) r=0;
if(g>255) g=255;
if(g<0) g=0;
if(b>255) b=255;
if(b<0) b=0;
Color color = new Color(img.getRGB(x,y),true)
Color colorBlur = new Color(r,g,b,color.getAlpha());
result.setRGB(x, y, colorBlur.getRGB());
}
}
}
ImageIO.write(result, "JPG", out);
}
catch (IOException e)
{
e.printStackTrace();
}
を私はあなたがあなたのケースでは、フィルタ行列の和であるべき分割係数のためのパラメータが欠落していると信じて、 '9:私は推薦するぼかしの概念の素敵な初心者チュートリアルについては
'。さもなければ '> 255'を意味する' 9'ピクセルの合計を行います。 – Elia
@Eliaあなたは答えとして追加する必要があります...もっと一般的なのは、マトリックス自体を分割(正規化)して、合計が1になるようにすることです。各ピクセルで除算する必要はありません。 – Spektre