今回は画像の「淡色化」をやってみます。これは画像全体の「鮮やかさ」を失わせる処理で、画像処理においては色があせたような感じを出したり「セピア」調にする前処理にも使えるでしょう。
色の鮮やかさ
まず、色の「鮮やかさ」とは何でしょうか? とりあえず今回は、鮮やかさを「そのピクセルの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の倍数ピクセルのものです。