« Unicode対応が... | メイン | Exim »

2005年05月10日

イコライズのソースコード

突然ですが、ビットマップのイコライズ(ヒストグラム均等化)のソースです。


uses Math;

type 

  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array [Byte] of TRGBTriple;

 ・
 ・
 ・

procedure Equalise(bmp: TBitmap);

  // 単純なグレースケール値取得
  function GetGrayscaleLevel(Value: TRGBTriple): Byte;
  begin
    Result := (Value.rgbtRed + Value.rgbtGreen + Value.rgbtBlue) div 3;
  end;

var
  Histgram, Map: array[0..255] of Cardinal;
  EqualizedMap:  array[0..255] of Byte;
  pLine: PRGBTripleArray;
  x, y, i, j: Integer;
  Low, High: Cardinal;
begin

  // Bitmapを24ビットカラーにする
  Bmp.PixelFormat := pf24bit;

  // ヒストグラムを初期化する
  ZeroMemory(@Histgram, SizeOf(Histgram));
  ZeroMemory(@Map, SizeOf(Map));
  ZeroMemory(@EqualizedMap, SizeOf(EqualizedMap));

  // ヒストグラム作成
  for y := 0 to bmp.Height - 1 do
  begin
    pLine := bmp.ScanLine[y];
    for x := 0 to bmp.Width - 1 do
      Inc(Histgram[GetGrayscaleLevel(pLine^[x])]);
  end;

  // ヒストグラム統合
  j := 0;
  for i := 0 to 255 do
  begin
    Inc(j, Histgram[i]);
    Map[i] := j;
  end;
  Low  := Map[0];
  High := Map[255];

  // 均等化マップ作成
  for i := 0 to 255 do
    EqualizedMap[i] := ((Map[i] - Low) * 255) div Max(High - Low, 1);

  // ピクセル情報置換
  for y := 0 to bmp.Height - 1 do
  begin
    pLine := bmp.ScanLine[y];
    for x := 0 to bmp.Width - 1 do
    begin
      pLine^[x].rgbtBlue := EqualizedMap[pLine^[x].rgbtBlue];
      pLine^[x].rgbtGreen := EqualizedMap[pLine^[x].rgbtGreen];
      pLine^[x].rgbtRed := EqualizedMap[pLine^[x].rgbtRed];
    end;
  end;
end;

投稿者 woodybells : 2005年05月10日 00:31

トラックバック

このエントリーのトラックバックURL:
http://sv59.xserver.jp/~woodybells/woodybells.com/mt/mt-tb.cgi/6

コメント

コメントしてください




保存しますか?