« 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