画像の滲み処理

ぼかし処理では、全体に靄がかかったように「やわらかく」なる感じでぼかしてみました。今回は、もう少し「きつい」感じでちょうど滲んで行くような、あるいはピンぼけのような感じを出してみる事にしましょう。

滲み処理と処理時間の測定

ぼかし処理では、処理対象のピクセルの色を上下左右4ピクセルの色と混ぜ合わせていました。滲み処理も似たような考え方で実現できますが、今度は混ぜ合わせる範囲を広げ処理対象となるピクセルを中心とする5×5ピクセルのブロック(処理対象のピクセル自身も含む)の色を平均して、それを混ぜ合わせる事にします。
この処理を行うには、処理対象のピクセルから±2の範囲のピクセルでRGBの平均を求め、混ぜ合わせれば良いですね。RGBの各成分を合計する時、ビットマップの「外」を参照しないように注意しながらプログラムを書いてみましょう。以下はその一例です。

  /* ビットマップを作業用領域にコピー */
  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; /* 合計されたピクセル数 */

              for (ii=-3;ii<4;ii++) /* ブロック内のRGB成分を合計 */
                  for (jj=-3;jj<4;jj++)
                      if (j+jj>0 && j+jj<iWidth &&i+ii>0 && i+ii<iHeight) {

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

                          n++;

                      }

                      /* ブロック平均のピクセルの色と「混ぜ合わせて」にじませる */
                      lpBMP[j*3+i*iWidth*3]=(lpWork[j*3+i*iWidth*3]+iBlue/n)/2;
                      lpBMP[j*3+i*iWidth*3+1]=(lpWork[j*3+i*iWidth*3+1]+iGreen/n)/2;
                      lpBMP[j*3+i*iWidth*3+2]=(lpWork[j*3+i*iWidth*3+2]+iRed/n)/2;

          }

また今回のプログラムでは、処理の前後の時間を調べて処理にかかった時間を測定し、表示してみました。

  iTime1=GetTickCount(); /* 処理開始前の時間を記録 */
       ・
       ・
       処理
       ・
       ・
  iTime=GetTickCount()-iTime1; /* 処理にかかった時間を計算 */

プログラム

今回のプログラムは、ビットマップファイルを読み込んで表示し、それを滲ませる処理を行います。まず、ビットマップファイルをドラッグ&ドロップするか「読み込み」ボタンで読み込んだ後、「滲み処理」ボタンで滲み処理をかけてみてください。
全体に水に浸けて滲ませたような、「ぼかし」の時よりもかなりはっきりした効果が得られるでしょう。

プログラムソース表示

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


プログラミング資料庫 > DIB/Waveによる音声画像処理実験室