フルカラービットマップのピクセルは、RGBの成分で表現されています。このピクセルの成分を、「隣のピクセルとの成分差」という視点で調べると何が見えてくるでしょうか。今回は、4近傍(上下左右)のピクセルとのRGB成分差をグレースケールで表現しそこから何が見えてくるのか、調べてみる事にしました。 RGB成分の差今回は、あるピクセルと周辺4ピクセルのRGB成分差の絶対値を合計し、その数値でグレースケール化してみました。まずビットマップのピクセル列lpBMPを作業用バッファlpWrkにコピーし、この作業用バッファにピクセルの成分差の数値を書き込んでいきます。 LPBYTE lpWrk=GlobalAlloc(GPTR,dwLength*dwHeight); CopyMemory(lpWrk,lpBMP,dwLength*dwHeight); for (i=1;i<dwHeight-1;i++) for (j=1;j<dwWidth-1;j++) { d=0; for (k=-1;k<2;k++) { d+=abs(lpBMP[(j+k)*3+i*dwLength+2]-lpBMP[j*3+i*dwLength+2]); d+=abs(lpBMP[(j+k)*3+i*dwLength+1]-lpBMP[j*3+i*dwLength+1]); d+=abs(lpBMP[(j+k)*3+i*dwLength]-lpBMP[j*3+i*dwLength]); d+=abs(lpBMP[j*3+(i+k)*dwLength+2]-lpBMP[j*3+i*dwLength+2]); d+=abs(lpBMP[j*3+(i+k)*dwLength+1]-lpBMP[j*3+i*dwLength+1]); d+=abs(lpBMP[j*3+(i+k)*dwLength]-lpBMP[j*3+i*dwLength]); } d/=2; if (d>255) d=255; FillMemory(lpWrk+j*3+i*dwLength,3,(BYTE)d); } このループで各ピクセルと周辺ピクセルとのRGB成分差をdに加算し、その値を2で割った数値をバッファに記録していきます。そして、このバッファをビットマップのピクセル列にコピーすれば、「周辺ピクセルとのRGB成分差」をグレースケールで表現できた事になるでしょう。 プログラムウインドウにフルカラーBMPファイルをドロップして処理ボタンをクリックしてください。周辺ピクセルとの成分差を同じ大きさのグレースケールで表示します。これを見ると、周辺ピクセルとの成分差でビットマップ内の「輪郭」が浮かび上がってくるようですね。輪郭抽出や文字認識などに応用できるかもしれません |