ぼかし処理

モザイク処理を2ピクセルでかけてみると、全体に「ぼやけた」感じになりました。ただあの方法でぼかそうとすると、2ピクセル四方の「ブロック」で処理していたため、少し画像が荒くなってしまいますね。そこで今回は、一ピクセルずつ隣のピクセルと「混ぜ合わせる」画像処理を行ってぼかしてみましょう。

ぼかし処理のアルゴリズム

今回は、画像をぼかす処理を「周辺ピクセルとの色の違い」を小さくする画像処理として考えてみることにします。具体的には、あるピクセルの色をその上下左右のピクセルの色の「平均」と混ぜ合わせる、という画像処理を試してみることにしました。

ビットマップが24ビットDIBなら、各ピクセルのRGB成分は容易に取得できますね。まず、処理対象となるピクセルの周囲4ピクセル(上下左右)のRGB成分をそれぞれ平均し、それと処理対象ピクセルのRGB成分を一定の割合で「混ぜ合わせる」ことでぼかし処理を行ってみましょう。

例えば、混ぜ合わせる比を処理対象ピクセルの色2:周囲のピクセルの色1とするなら、処理対象となるピクセル(x、y)のR成分は以下のようになります。

・周囲のR成分平均=((x、y+1)のR成分+(x+1、y)のR成分+
           (x、yー1)のR成分+(xー1、y)のR成分)/4

・(x、y)のR成分=((x、y)のR成分×2+周囲のR成分平均)/3

 後は、これと同じ処理をG成分、B成分に対しても行うだけです。ただし、この処理を行う時は処理を行う前にビットマップを作業用領域にコピーして、その作業用領域のビットマップを対象に周囲の色を平均してください。なぜなら、ビットマップのピクセルはぼかし処理の過程で変化してしまうからです。

ぼかし処理のプログラム例

  /* ビットマップを作業用領域にコピー */
  CopyMemory(lpWork,lpBMP,iWidth*iHeight*3);

  for (i=0;i<iHeight;i++) /* 各ピクセルをぼかす */
      for (j=0;j<iWidth;j++) {

          iRed=0;   /* R成分合計 */
          iGreen=0; /* G成分合計 */
          iBlue=0;  /* B成分合計 */

          n=0; /* 合計されたピクセル数 */

          if (i<iHeight-1) { /* 一つ上のピクセル */

              /* 各色の成分を色成分合計に加算 */
              iRed+   = lpWork[j*3+(i+1)*iWidth*3+2];
              iGreen+ = lpWork[j*3+(i+1)*iWidth*3+1];
              iBlue+  = lpWork[j*3+(i+1)*iWidth*3];

              n++; /* 合計されたピクセル数加算 */

          }

          if (j<iWidth-1) { /* 一つ右のピクセル */

              iRed+   = lpWork[(j+1)*3+i*iWidth*3+2];
              iGreen+ = lpWork[(j+1)*3+i*iWidth*3+1];
              iBlue+  = lpWork[(j+1)*3+i*iWidth*3];

              n++;

          }

          if (i>0) { /* 一つ下のピクセル */

              iRed+   = lpWork[j*3+(i-1)*iWidth*3+2];
              iGreen+ = lpWork[j*3+(i-1)*iWidth*3+1];
              iBlue+  = lpWork[j*3+(i-1)*iWidth*3];

              n++;

          }

          if (j>0) { /* 一つ左のピクセル */

              iRed+   = lpWork[(j-1)*3+i*iWidth*3+2];
              iGreen+ = lpWork[(j-1)*3+i*iWidth*3+1];
              iBlue+  = lpWork[(j-1)*3+i*iWidth*3];

              n++;

          }

          /* 上下左右のピクセルの色と「混ぜ合わせて」ぼかす */
          lpBMP[j*3+i*iWidth*3]   = (lpWork[j*3+i*iWidth*3]*2+iBlue/n)/3;
          lpBMP[j*3+i*iWidth*3+1] = (lpWork[j*3+i*iWidth*3+1]*2+iGreen/n)/3;
          lpBMP[j*3+i*iWidth*3+2] = (lpWork[j*3+i*iWidth*3+2]*2+iRed/n)/3;

  }

ぼかし処理のプログラム

今回のプログラムは、ビットマップファイルを読み込んで表示し、ぼかし処理を行います。まず、ビットマップファイルをドラッグ&ドロップするか「読み込み」ボタンで読み込んだ後、「ぼかす」ボタンでぼかし処理をかけてみてください。1、2回ではあまり変化がないでしょうが、何度かぼかし処理をするうちに全体に靄がかかったようなあるいは全体が「柔らかく」なっていく感じになるでしょう。

プログラムソース表示

読み込めるビットマップは、24ビットフルカラーで幅が4の倍数ピクセルのものです。