淡色化処理

今回は画像の「淡色化」をやってみます。これは画像全体の「鮮やかさ」を失わせる処理で、画像処理においては色があせたような感じを出したり「セピア」調にする前処理にも使えるでしょう。

色の鮮やかさ

まず、色の「鮮やかさ」とは何でしょうか? とりあえず今回は、鮮やかさを「そのピクセルのRGBの平均からRGB各成分がどれだけ離れているか」を表すもの、ととらえてみましょう。
こうしてみると、鮮やかさにおいては「RGBの各成分とRGBの平均の差」が問題になるはずです。

例えば、GBが192のピクセルのR成分について考えてみます。もし、Rが192ならこれは灰色(192、192、192)で、「鮮やかさ」は全くありません。そして、 R成分が192より大きい時は大きいほど「鮮やか」な赤になり、192より小さい時は小さいほど「鮮やか」な水色になっていきます。
つまり、R成分が平均から離れれば離れるほど「鮮やか」になるのです。逆に言えば、RGBの各成分をRGBの平均に近づければ「淡色化」できる事になるでしょう。

というわけでプログラムです。

今回の関数gray()では、幅iWidthピクセル、高さiHeightピクセルの24ビットDIBを対象に各ピクセルのRGBの平均を求め、RGBの各成分をその値に近づける(RGB各成分とRGB平均を平均する)処理を行っています。本当は、単にRGBを平均するのではなく「明るさ」を考えながら処理すべきなのでしょうが、とりあえず「雰囲気」は出るので良しとしましょう。

  void gray(void) { /* 淡色化処理 */

  int iGray,i,j;

  for (i=0;i<iHeight;i++) /* 各ピクセルを淡色化 */
      for (j=0;j<iWidth;j++) {

          iGray=lpBMP[j*3+i*iWidth*3]; /* RGBの平均を求める */
          iGray+=lpBMP[j*3+i*iWidth*3+1];
          iGray+=lpBMP[j*3+i*iWidth*3+2];
          iGray=iGray/3;

          /* ピクセルのRGB各成分を平均に「近づけて」淡色化 */
          lpBMP[j*3+i*iWidth*3]=(iGray+lpBMP[j*3+i*iWidth*3])/2;
          lpBMP[j*3+i*iWidth*3+1]=(iGray+lpBMP[j*3+i*iWidth*3+1])/2;
          lpBMP[j*3+i*iWidth*3+2]=(iGray+lpBMP[j*3+i*iWidth*3+2])/2;

      }

  InvalidateRgn(hwnd,NULL,FALSE);
  UpdateWindow (hwnd);             // 再描画

  }

・プログラム

今回のプログラムは、ビットマップファイルを読み込んで表示し、それを淡色化する処理を行います。まず、ビットマップファイルをドラッグ&ドロップするか「読み込み」ボタンで読み込んだ後、「淡色化」ボタンで淡色化処理をかけてみてください。
表示されている画像が全体に色あせて行くのがわかると思います。

プログラムソース表示

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


プログラミング資料庫 > 画像処理実験室