2017-04-03 12 views
0

以下のコードは画像処理ルーチンです。 xとyは、画像を構成するすべてのピクセルの座標を表します。基本は次のとおりです。Javaでx座標とy座標が与えられている場合、どのように画像をぼかしますか?

  • 各ピクセルのx、y座標です。
  • imgH、IMGW - 画像
  • R、G、Bの画素で高さと幅 - 、赤、緑、及び各ピクセルの青のレベル

コードが実行するループのための二重を使用し画像内の各ピクセルに何かがあります。このforループの中で何をしたいのかは、各ピクセルについてです。周りの8ピクセルのr、g、b値を平均し、その平均を中心ピクセルの値にしたいとします。これにより、画像のぼかし効果が生じます。誰も私にこれを手伝ってもらえますか?

protected void proc_17() { 
    info = ""; 
    for (int y = 0; y < imgH; y++) { 
     for (int x = 0; x < imgW; x++) { 
      int xNext = (x+1) % imgW; 
      int yNext = (y+1) % imgH; 
      float r = (imgOld.getR(xNext, yNext) + imgOld.getR(xNext, yNext))/8; 
      float g = (imgOld.getG(xNext, yNext) + imgOld.getG(xNext, yNext))/8; 
      float b = (imgOld.getB(xNext, yNext) + imgOld.getB(xNext, yNext))/8; 
      imgNew.setR(x, y, r); 
      imgNew.setG(x, y, g); 
      imgNew.setB(x, y, b); 
     } 
    } 
} 
+0

。そうでなければ計算は既にぼかされたいくつかのピクセルを使って行われます – nhouser9

+0

'(imgOld.getR(xNext、yNext)+ imgOld.getR(xNext、yNext))/ 8;'を 'imgOld.getR(xNext、 yNext)/ 4; '? – CraigR8806

+0

4で除算を加えるだけで、各ピクセルのRGB値が小さくなり、値が一様に減少するため、画像が暗くなります。 – Teej

答えて

0

平滑化又は平均化は、通常1に等しい和を有する唯一の非負の要素(重み)と対称非ゼロ行列と畳み込みを用いて行われます。通常の4近傍平滑化行列次のようになります。

0.0 0.1 0.0 
0.1 0.6 0.1 
0.0 0.1 0.0 

8近傍:ウェイトが1に加算された場合

0.05 0.10 0.05 
0.10 0.20 0.10 
0.05 0.10 0.05 
  • 、結果の大きさは、入力と同じになります。対称行列が結果をシフトしていないだろう...行列の
  • 解像度はあなたに

をスムーズに距離を与える今、あなたはので、追加画像ストレージが使用することによって必要とされていないインプレースもこれを行うことができます

  • 0.50 0.25 
    0.25 0.00 
    

    、次いで:

    0.00 0.25 
    0.25 0.50 
    

    あなたが見ることができるように、行列は中心にも対称でもないので、結果はシフトされますが、シフトは反対であり、互いに打ち消し合います。あなたが個別に粗いの各画素のr,g,bを処理する必要が

    for (y=0;y<ys-1;y++) 
    for (x=0;x<xs-1;x++) 
        pixel[y][x]=(2*pixel[y][x]+pixel[y+1][x]+pixel[y][x+1])/4; 
    
    for (y=ys-1;y>0;y--) 
    for (x=xs-1;x>0;x--) 
        pixel[y][x]=(2*pixel[y][x]+pixel[y-1][x]+pixel[y][x-1])/4; 
    

    :コードは次のようになります。 xs,ysは画像解像度で、pixel[][]は画像の直接ピクセルアクセスです。また、境界ピクセルを処理する必要がありますので、異なるマトリックスでそれらを滑らかにするか、結果イメージを各側から1ピクセルずつ縮小します(必要なものに依存します)。ウェイトは2の乗算と4の除算の結果になります。これは速度のビットシフト演算で行うことができます(コンパイラが単独では実行しない場合)

    滑らかさの強さを高めるには、回。より多くのアイデアについては

    for (i=0;i<smooth_strength;i++) 
    { 
    for (y=0;y<ys-1;y++) 
        for (x=0;x<xs-1;x++) 
        pixel[y][x]=(2*pixel[y][x]+pixel[y+1][x]+pixel[y][x+1])/4; 
    
    for (y=ys-1;y>0;y--) 
        for (x=xs-1;x>0;x--) 
        pixel[y][x]=(2*pixel[y][x]+pixel[y-1][x]+pixel[y][x-1])/4; 
    } 
    

    を見てみましょう:あなたは新しい値を計算するために、一度にそれらを適用するために1回、2回ループする必要があるとしている

  • 関連する問題