2016-11-08 5 views
1

最近畳み込みフィルターについて読んだことがあります。私はイメージをぼかすコードを作りたがったが、それが明るくなっている。私はしばらくの間私のコードを見てきましたが、間違いを見つけることはできません。誰でも助けてくれますか?畳み込みブラーフィルターが機能せず、画像が明るくなります

は、ここに私のコードです:

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

そしてここaplyingフィルタ前の画像です: Before aplying filter 以降: After aplying filter

+3

を私はあなたがあなたのケースでは、フィルタ行列の和であるべき分割係数のためのパラメータが欠落していると信じて、 '9:私は推薦するぼかしの概念の素敵な初心者チュートリアルについては

'。さもなければ '> 255'を意味する' 9'ピクセルの合計を行います。 – Elia

+0

@Eliaあなたは答えとして追加する必要があります...もっと一般的なのは、マトリックス自体を分割(正規化)して、合計が1になるようにすることです。各ピクセルで除算する必要はありません。 – Spektre

答えて

1

は、あなたが望む結果を得るために2つのオプションがあります。
1の合計(上記のコメントの@Spektreと同様)を持つフィルタ行列を作成するか、またはピクセルの新しい値に係数1/sum(filterMatrix)を掛けます。 Concept of Blurring - www.TutorialsPoint.com

+0

行: 'r = r/9; \t \t \t \t \tg = g/9; \t \t \t \t b = b/9; '今度は画像が明るくなりませんが、違いは見られません。ぼかしはありません。 – matip

+0

私はマトリックスを大きく9x9にしました。マトリックスが大きければ大きいほどぼかしは強くなりますか?もしそうなら、なぜチュートリアルごとに3x3行列の例が見えますか? – matip

+0

@matipリンクから、私は自分の答えに次のように追加しました。「大きなマスクではピクセル数が増え、1つの滑らかな遷移が定義されるからです。 – Elia

関連する問題