トーンカーブ(コントラスト改善)のサンプルコード
画像に「トーンカーブ(コントラスト改善)」の処理をするサンプルです。ソースコードは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] := 1;
LookUpTable[3] := 2;
LookUpTable[4] := 2;
LookUpTable[5] := 3;
LookUpTable[6] := 3;
LookUpTable[7] := 3;
LookUpTable[8] := 4;
LookUpTable[9] := 4;
LookUpTable[10] := 5;
LookUpTable[11] := 5;
LookUpTable[12] := 5;
LookUpTable[13] := 6;
LookUpTable[14] := 6;
LookUpTable[15] := 7;
LookUpTable[16] := 7;
LookUpTable[17] := 7;
LookUpTable[18] := 8;
LookUpTable[19] := 8;
LookUpTable[20] := 9;
LookUpTable[21] := 9;
LookUpTable[22] := 9;
LookUpTable[23] := 10;
LookUpTable[24] := 10;
LookUpTable[25] := 11;
LookUpTable[26] := 11;
LookUpTable[27] := 11;
LookUpTable[28] := 12;
LookUpTable[29] := 12;
LookUpTable[30] := 13;
LookUpTable[31] := 13;
LookUpTable[32] := 13;
LookUpTable[33] := 14;
LookUpTable[34] := 14;
LookUpTable[35] := 15;
LookUpTable[36] := 15;
LookUpTable[37] := 15;
LookUpTable[38] := 16;
LookUpTable[39] := 16;
LookUpTable[40] := 17;
LookUpTable[41] := 17;
LookUpTable[42] := 18;
LookUpTable[43] := 19;
LookUpTable[44] := 20;
LookUpTable[45] := 20;
LookUpTable[46] := 21;
LookUpTable[47] := 22;
LookUpTable[48] := 23;
LookUpTable[49] := 24;
LookUpTable[50] := 24;
LookUpTable[51] := 25;
LookUpTable[52] := 26;
LookUpTable[53] := 27;
LookUpTable[54] := 28;
LookUpTable[55] := 28;
LookUpTable[56] := 29;
LookUpTable[57] := 30;
LookUpTable[58] := 31;
LookUpTable[59] := 32;
LookUpTable[60] := 33;
LookUpTable[61] := 33;
LookUpTable[62] := 34;
LookUpTable[63] := 35;
LookUpTable[64] := 36;
LookUpTable[65] := 37;
LookUpTable[66] := 37;
LookUpTable[67] := 38;
LookUpTable[68] := 39;
LookUpTable[69] := 40;
LookUpTable[70] := 41;
LookUpTable[71] := 41;
LookUpTable[72] := 42;
LookUpTable[73] := 43;
LookUpTable[74] := 44;
LookUpTable[75] := 45;
LookUpTable[76] := 45;
LookUpTable[77] := 46;
LookUpTable[78] := 47;
LookUpTable[79] := 48;
LookUpTable[80] := 49;
LookUpTable[81] := 50;
LookUpTable[82] := 51;
LookUpTable[83] := 53;
LookUpTable[84] := 54;
LookUpTable[85] := 55;
LookUpTable[86] := 56;
LookUpTable[87] := 57;
LookUpTable[88] := 58;
LookUpTable[89] := 59;
LookUpTable[90] := 60;
LookUpTable[91] := 62;
LookUpTable[92] := 63;
LookUpTable[93] := 64;
LookUpTable[94] := 65;
LookUpTable[95] := 66;
LookUpTable[96] := 67;
LookUpTable[97] := 68;
LookUpTable[98] := 70;
LookUpTable[99] := 71;
LookUpTable[100] := 72;
LookUpTable[101] := 73;
LookUpTable[102] := 74;
LookUpTable[103] := 75;
LookUpTable[104] := 76;
LookUpTable[105] := 77;
LookUpTable[106] := 79;
LookUpTable[107] := 80;
LookUpTable[108] := 81;
LookUpTable[109] := 82;
LookUpTable[110] := 83;
LookUpTable[111] := 85;
LookUpTable[112] := 88;
LookUpTable[113] := 91;
LookUpTable[114] := 93;
LookUpTable[115] := 95;
LookUpTable[116] := 98;
LookUpTable[117] := 101;
LookUpTable[118] := 103;
LookUpTable[119] := 105;
LookUpTable[120] := 108;
LookUpTable[121] := 111;
LookUpTable[122] := 113;
LookUpTable[123] := 115;
LookUpTable[124] := 118;
LookUpTable[125] := 121;
LookUpTable[126] := 123;
LookUpTable[127] := 125;
LookUpTable[128] := 128;
LookUpTable[129] := 129;
LookUpTable[130] := 132;
LookUpTable[131] := 136;
LookUpTable[132] := 139;
LookUpTable[133] := 142;
LookUpTable[134] := 145;
LookUpTable[135] := 149;
LookUpTable[136] := 152;
LookUpTable[137] := 155;
LookUpTable[138] := 159;
LookUpTable[139] := 162;
LookUpTable[140] := 165;
LookUpTable[141] := 168;
LookUpTable[142] := 172;
LookUpTable[143] := 175;
LookUpTable[144] := 176;
LookUpTable[145] := 177;
LookUpTable[146] := 178;
LookUpTable[147] := 180;
LookUpTable[148] := 181;
LookUpTable[149] := 182;
LookUpTable[150] := 183;
LookUpTable[151] := 184;
LookUpTable[152] := 186;
LookUpTable[153] := 187;
LookUpTable[154] := 188;
LookUpTable[155] := 189;
LookUpTable[156] := 191;
LookUpTable[157] := 192;
LookUpTable[158] := 193;
LookUpTable[159] := 194;
LookUpTable[160] := 195;
LookUpTable[161] := 197;
LookUpTable[162] := 198;
LookUpTable[163] := 199;
LookUpTable[164] := 200;
LookUpTable[165] := 201;
LookUpTable[166] := 203;
LookUpTable[167] := 204;
LookUpTable[168] := 205;
LookUpTable[169] := 206;
LookUpTable[170] := 208;
LookUpTable[171] := 209;
LookUpTable[172] := 210;
LookUpTable[173] := 211;
LookUpTable[174] := 212;
LookUpTable[175] := 212;
LookUpTable[176] := 213;
LookUpTable[177] := 213;
LookUpTable[178] := 214;
LookUpTable[179] := 215;
LookUpTable[180] := 215;
LookUpTable[181] := 216;
LookUpTable[182] := 216;
LookUpTable[183] := 217;
LookUpTable[184] := 218;
LookUpTable[185] := 218;
LookUpTable[186] := 219;
LookUpTable[187] := 219;
LookUpTable[188] := 220;
LookUpTable[189] := 221;
LookUpTable[190] := 221;
LookUpTable[191] := 222;
LookUpTable[192] := 222;
LookUpTable[193] := 223;
LookUpTable[194] := 224;
LookUpTable[195] := 224;
LookUpTable[196] := 225;
LookUpTable[197] := 225;
LookUpTable[198] := 226;
LookUpTable[199] := 227;
LookUpTable[200] := 227;
LookUpTable[201] := 228;
LookUpTable[202] := 228;
LookUpTable[203] := 229;
LookUpTable[204] := 230;
LookUpTable[205] := 230;
LookUpTable[206] := 231;
LookUpTable[207] := 231;
LookUpTable[208] := 232;
LookUpTable[209] := 233;
LookUpTable[210] := 233;
LookUpTable[211] := 234;
LookUpTable[212] := 234;
LookUpTable[213] := 235;
LookUpTable[214] := 236;
LookUpTable[215] := 236;
LookUpTable[216] := 237;
LookUpTable[217] := 237;
LookUpTable[218] := 238;
LookUpTable[219] := 238;
LookUpTable[220] := 239;
LookUpTable[221] := 239;
LookUpTable[222] := 240;
LookUpTable[223] := 240;
LookUpTable[224] := 241;
LookUpTable[225] := 241;
LookUpTable[226] := 242;
LookUpTable[227] := 242;
LookUpTable[228] := 242;
LookUpTable[229] := 243;
LookUpTable[230] := 243;
LookUpTable[231] := 244;
LookUpTable[232] := 244;
LookUpTable[233] := 245;
LookUpTable[234] := 245;
LookUpTable[235] := 246;
LookUpTable[236] := 246;
LookUpTable[237] := 247;
LookUpTable[238] := 247;
LookUpTable[239] := 248;
LookUpTable[240] := 248;
LookUpTable[241] := 249;
LookUpTable[242] := 249;
LookUpTable[243] := 249;
LookUpTable[244] := 250;
LookUpTable[245] := 250;
LookUpTable[246] := 251;
LookUpTable[247] := 251;
LookUpTable[248] := 252;
LookUpTable[249] := 252;
LookUpTable[250] := 253;
LookUpTable[251] := 253;
LookUpTable[252] := 254;
LookUpTable[253] := 254;
LookUpTable[254] := 255;
LookUpTable[255] := 255;
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:00276
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









