トーンカーブ(擬似ソラリゼーション)のサンプルコード
画像に「トーンカーブ(擬似ソラリゼーション)」の処理をするサンプルです。ソースコードはDelphi5で作成しましたがその他の言語でも流用できるかと思います。
画像処理の結果
トーンカーブ(擬似ソラリゼーション)をすると下図のようになります。
トーンカーブの設定値
このトーンカーブの設定値は下図になります。
ソースコード
[EffectBass.pas - 汎用モジュール]
//Bass Unit unit EffectBass; interface uses Windows,SysUtils, Classes, Graphics; type //24bitアクセス用ポインタ pRGBarray = ^TRGBarray; TRGBarray = array[0..0] of TRGBTriple; //None リテラル type //24bitアクセス用ダブルポインタ PPBits = ^TPBits; TPBits = array[0..0] of pRGBarray; //None リテラル //汎用プロシージャ procedure Set24bit(Src,Dest :TBitmap); function Set255(Value : integer) : BYTE; implementation ///////// procedure Set24bit(Src,Dest :Tbitmap); begin Src.PixelFormat :=pf24bit; Dest.PixelFormat:=pf24bit; Dest.Width:=Src.Width; Dest.Height:=Src.Height; end; ///////// function Set255(Value:Integer):Byte; begin if Value>=255 then Result:=255 else if Value<=0 then Result:=0 else Result:=Value; end; end.
[トーンカーブ(擬似ソラリゼーション)の関数 - 汎用トーンカーブ]
//----------------------------------------------------------------------------- //■関数 EffectToneCurve //■用途 トーンカーブ //■引数 hBMP ...転送元のビットマップのハンドル // LookUpTable ...ルックアップテーブル(配列の添え字はX軸、配列の中身はY軸) // array [0..255] of Byte //■戻り値 // 新しいビットマップのハンドル //----------------------------------------------------------------------------- function EffectToneCurve(hBMP : HBitmap;LookUpTable : array of Byte): HBitmap; var Row,Col : Integer; SrcRow,DestRow : pRGBArray; SrcBitmap,DestBitmap:TBitmap ; begin SrcBitmap := TBitmap.Create; DestBitmap:= TBitmap.Create; SrcBitmap.handle :=hBMP; Set24bit(SrcBitmap,DestBitmap); try for Row := 0 to SrcBitmap.Height - 1 do begin SrcRow := SrcBitmap.Scanline[Row]; DestRow := DestBitmap.Scanline[Row]; for Col := 0 to SrcBitmap.Width - 1 do begin DestRow[Col].rgbtRed :=LookUpTable[SrcRow[Col].rgbtRed]; DestRow[Col].rgbtGreen :=LookUpTable[SrcRow[Col].rgbtGreen]; DestRow[Col].rgbtBlue :=LookUpTable[SrcRow[Col].rgbtBlue] ; end; end; Result :=DestBitmap.ReleaseHandle; except Result :=SrcBitmap.ReleaseHandle; end; SrcBitmap.Free ; DestBitmap.Free; end;
[関数の呼び出し]
procedure TForm1.Button1Click(Sender: TObject); var LookUpTable : array [0..255] of Byte; // 配列の添え字はX軸、配列の中身はY軸 begin // 擬似ソラリゼーション LookUpTable[0] := 0; LookUpTable[1] := 1; LookUpTable[2] := 9; LookUpTable[3] := 18; LookUpTable[4] := 26; LookUpTable[5] := 35; LookUpTable[6] := 43; LookUpTable[7] := 52; LookUpTable[8] := 60; LookUpTable[9] := 69; LookUpTable[10] := 77; LookUpTable[11] := 86; LookUpTable[12] := 94; LookUpTable[13] := 103; LookUpTable[14] := 111; LookUpTable[15] := 120; LookUpTable[16] := 128; LookUpTable[17] := 136; LookUpTable[18] := 145; LookUpTable[19] := 153; LookUpTable[20] := 162; LookUpTable[21] := 170; LookUpTable[22] := 179; LookUpTable[23] := 187; LookUpTable[24] := 196; LookUpTable[25] := 204; LookUpTable[26] := 213; LookUpTable[27] := 221; LookUpTable[28] := 230; LookUpTable[29] := 238; LookUpTable[30] := 247; LookUpTable[31] := 255; LookUpTable[32] := 254; LookUpTable[33] := 246; LookUpTable[34] := 238; LookUpTable[35] := 230; LookUpTable[36] := 222; LookUpTable[37] := 214; LookUpTable[38] := 206; LookUpTable[39] := 198; LookUpTable[40] := 190; LookUpTable[41] := 183; LookUpTable[42] := 175; LookUpTable[43] := 167; LookUpTable[44] := 159; LookUpTable[45] := 151; LookUpTable[46] := 143; LookUpTable[47] := 135; LookUpTable[48] := 127; LookUpTable[49] := 119; LookUpTable[50] := 111; LookUpTable[51] := 103; LookUpTable[52] := 95; LookUpTable[53] := 87; LookUpTable[54] := 79; LookUpTable[55] := 71; LookUpTable[56] := 64; LookUpTable[57] := 56; LookUpTable[58] := 48; LookUpTable[59] := 40; LookUpTable[60] := 32; LookUpTable[61] := 24; LookUpTable[62] := 16; LookUpTable[63] := 8; LookUpTable[64] := 0; LookUpTable[65] := 1; LookUpTable[66] := 9; LookUpTable[67] := 17; LookUpTable[68] := 26; LookUpTable[69] := 34; LookUpTable[70] := 42; LookUpTable[71] := 50; LookUpTable[72] := 58; LookUpTable[73] := 67; LookUpTable[74] := 75; LookUpTable[75] := 83; LookUpTable[76] := 91; LookUpTable[77] := 99; LookUpTable[78] := 108; LookUpTable[79] := 116; LookUpTable[80] := 124; LookUpTable[81] := 132; LookUpTable[82] := 140; LookUpTable[83] := 148; LookUpTable[84] := 157; LookUpTable[85] := 165; LookUpTable[86] := 173; LookUpTable[87] := 181; LookUpTable[88] := 189; LookUpTable[89] := 198; LookUpTable[90] := 206; LookUpTable[91] := 214; LookUpTable[92] := 222; LookUpTable[93] := 230; LookUpTable[94] := 239; LookUpTable[95] := 247; LookUpTable[96] := 255; LookUpTable[97] := 254; LookUpTable[98] := 246; LookUpTable[99] := 238; LookUpTable[100] := 229; LookUpTable[101] := 221; LookUpTable[102] := 213; LookUpTable[103] := 205; LookUpTable[104] := 197; LookUpTable[105] := 188; LookUpTable[106] := 180; LookUpTable[107] := 172; LookUpTable[108] := 164; LookUpTable[109] := 156; LookUpTable[110] := 147; LookUpTable[111] := 139; LookUpTable[112] := 131; LookUpTable[113] := 123; LookUpTable[114] := 115; LookUpTable[115] := 107; LookUpTable[116] := 98; LookUpTable[117] := 90; LookUpTable[118] := 82; LookUpTable[119] := 74; LookUpTable[120] := 66; LookUpTable[121] := 57; LookUpTable[122] := 49; LookUpTable[123] := 41; LookUpTable[124] := 33; LookUpTable[125] := 25; LookUpTable[126] := 16; LookUpTable[127] := 8; LookUpTable[128] := 0; LookUpTable[129] := 1; LookUpTable[130] := 9; LookUpTable[131] := 17; LookUpTable[132] := 26; LookUpTable[133] := 34; LookUpTable[134] := 42; LookUpTable[135] := 50; LookUpTable[136] := 58; LookUpTable[137] := 67; LookUpTable[138] := 75; LookUpTable[139] := 83; LookUpTable[140] := 91; LookUpTable[141] := 99; LookUpTable[142] := 108; LookUpTable[143] := 116; LookUpTable[144] := 124; LookUpTable[145] := 132; LookUpTable[146] := 140; LookUpTable[147] := 148; LookUpTable[148] := 157; LookUpTable[149] := 165; LookUpTable[150] := 173; LookUpTable[151] := 181; LookUpTable[152] := 189; LookUpTable[153] := 198; LookUpTable[154] := 206; LookUpTable[155] := 214; LookUpTable[156] := 222; LookUpTable[157] := 230; LookUpTable[158] := 239; LookUpTable[159] := 247; LookUpTable[160] := 255; LookUpTable[161] := 254; LookUpTable[162] := 246; LookUpTable[163] := 238; LookUpTable[164] := 229; LookUpTable[165] := 221; LookUpTable[166] := 213; LookUpTable[167] := 205; LookUpTable[168] := 197; LookUpTable[169] := 188; LookUpTable[170] := 180; LookUpTable[171] := 172; LookUpTable[172] := 164; LookUpTable[173] := 156; LookUpTable[174] := 147; LookUpTable[175] := 139; LookUpTable[176] := 131; LookUpTable[177] := 123; LookUpTable[178] := 115; LookUpTable[179] := 107; LookUpTable[180] := 98; LookUpTable[181] := 90; LookUpTable[182] := 82; LookUpTable[183] := 74; LookUpTable[184] := 66; LookUpTable[185] := 57; LookUpTable[186] := 49; LookUpTable[187] := 41; LookUpTable[188] := 33; LookUpTable[189] := 25; LookUpTable[190] := 16; LookUpTable[191] := 8; LookUpTable[192] := 0; LookUpTable[193] := 1; LookUpTable[194] := 9; LookUpTable[195] := 16; LookUpTable[196] := 24; LookUpTable[197] := 32; LookUpTable[198] := 39; LookUpTable[199] := 47; LookUpTable[200] := 55; LookUpTable[201] := 63; LookUpTable[202] := 70; LookUpTable[203] := 78; LookUpTable[204] := 86; LookUpTable[205] := 93; LookUpTable[206] := 101; LookUpTable[207] := 109; LookUpTable[208] := 116; LookUpTable[209] := 124; LookUpTable[210] := 132; LookUpTable[211] := 140; LookUpTable[212] := 147; LookUpTable[213] := 155; LookUpTable[214] := 163; LookUpTable[215] := 170; LookUpTable[216] := 178; LookUpTable[217] := 186; LookUpTable[218] := 193; LookUpTable[219] := 201; LookUpTable[220] := 209; LookUpTable[221] := 217; LookUpTable[222] := 224; LookUpTable[223] := 232; LookUpTable[224] := 240; LookUpTable[225] := 247; LookUpTable[226] := 255; LookUpTable[227] := 254; LookUpTable[228] := 245; LookUpTable[229] := 236; LookUpTable[230] := 227; LookUpTable[231] := 218; LookUpTable[232] := 209; LookUpTable[233] := 200; LookUpTable[234] := 191; LookUpTable[235] := 181; LookUpTable[236] := 172; LookUpTable[237] := 163; LookUpTable[238] := 154; LookUpTable[239] := 145; LookUpTable[240] := 136; LookUpTable[241] := 127; LookUpTable[242] := 118; LookUpTable[243] := 109; LookUpTable[244] := 100; LookUpTable[245] := 91; LookUpTable[246] := 82; LookUpTable[247] := 73; LookUpTable[248] := 64; LookUpTable[249] := 54; LookUpTable[250] := 45; LookUpTable[251] := 36; LookUpTable[252] := 27; LookUpTable[253] := 18; LookUpTable[254] := 9; LookUpTable[255] := 0; Image1.Picture.Bitmap.Handle := EffectToneCurve(Image1.Picture.Bitmap.ReleaseHandle,LookUpTable); end;
このトーンカーブをテストできるソフトウェア
このトーンカーブ処理をテストできる無料ソフトウェアをご紹介します。
<操作方法>
1.下記からダウンロードして実行します。
2.画像ファイルを適宜読み込みます。
3.メニューの[カラー]から[トーンカーブ]を選択します。
4.そのトーンカーブ画面でトーンカーブを任意に設定する。
5.OKボタンを押せばトーンカーブの実行となります。
疾風-tokikaze- v1.60
http://papy.world.coocan.jp/o1.html
高校や大学などの画像処理関連の授業で使用されていた事もあるようです。
スポンサーリンク
関連記事
公開日:2015年02月23日 最終更新日:2016年06月29日
記事NO:00272