ホーム > カテゴリ > 画像処理工学 >

トーンカーブ(階調反転)のサンプルコード

画像に「トーンカーブ(階調反転)」の処理をするサンプルです。ソースコードは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] := 255;
    LookUpTable[1] := 254;
    LookUpTable[2] := 253;
    LookUpTable[3] := 252;
    LookUpTable[4] := 251;
    LookUpTable[5] := 250;
    LookUpTable[6] := 249;
    LookUpTable[7] := 248;
    LookUpTable[8] := 247;
    LookUpTable[9] := 246;
    LookUpTable[10] := 245;
    LookUpTable[11] := 244;
    LookUpTable[12] := 243;
    LookUpTable[13] := 242;
    LookUpTable[14] := 241;
    LookUpTable[15] := 240;
    LookUpTable[16] := 239;
    LookUpTable[17] := 238;
    LookUpTable[18] := 237;
    LookUpTable[19] := 236;
    LookUpTable[20] := 235;
    LookUpTable[21] := 234;
    LookUpTable[22] := 233;
    LookUpTable[23] := 232;
    LookUpTable[24] := 231;
    LookUpTable[25] := 230;
    LookUpTable[26] := 229;
    LookUpTable[27] := 228;
    LookUpTable[28] := 227;
    LookUpTable[29] := 226;
    LookUpTable[30] := 225;
    LookUpTable[31] := 224;
    LookUpTable[32] := 223;
    LookUpTable[33] := 222;
    LookUpTable[34] := 221;
    LookUpTable[35] := 220;
    LookUpTable[36] := 219;
    LookUpTable[37] := 218;
    LookUpTable[38] := 217;
    LookUpTable[39] := 216;
    LookUpTable[40] := 215;
    LookUpTable[41] := 214;
    LookUpTable[42] := 213;
    LookUpTable[43] := 212;
    LookUpTable[44] := 211;
    LookUpTable[45] := 210;
    LookUpTable[46] := 209;
    LookUpTable[47] := 208;
    LookUpTable[48] := 207;
    LookUpTable[49] := 206;
    LookUpTable[50] := 205;
    LookUpTable[51] := 204;
    LookUpTable[52] := 203;
    LookUpTable[53] := 202;
    LookUpTable[54] := 201;
    LookUpTable[55] := 200;
    LookUpTable[56] := 199;
    LookUpTable[57] := 198;
    LookUpTable[58] := 197;
    LookUpTable[59] := 196;
    LookUpTable[60] := 195;
    LookUpTable[61] := 194;
    LookUpTable[62] := 193;
    LookUpTable[63] := 192;
    LookUpTable[64] := 191;
    LookUpTable[65] := 190;
    LookUpTable[66] := 189;
    LookUpTable[67] := 188;
    LookUpTable[68] := 187;
    LookUpTable[69] := 186;
    LookUpTable[70] := 185;
    LookUpTable[71] := 184;
    LookUpTable[72] := 183;
    LookUpTable[73] := 182;
    LookUpTable[74] := 181;
    LookUpTable[75] := 180;
    LookUpTable[76] := 179;
    LookUpTable[77] := 178;
    LookUpTable[78] := 177;
    LookUpTable[79] := 176;
    LookUpTable[80] := 175;
    LookUpTable[81] := 174;
    LookUpTable[82] := 173;
    LookUpTable[83] := 172;
    LookUpTable[84] := 171;
    LookUpTable[85] := 170;
    LookUpTable[86] := 169;
    LookUpTable[87] := 168;
    LookUpTable[88] := 167;
    LookUpTable[89] := 166;
    LookUpTable[90] := 165;
    LookUpTable[91] := 164;
    LookUpTable[92] := 163;
    LookUpTable[93] := 162;
    LookUpTable[94] := 161;
    LookUpTable[95] := 160;
    LookUpTable[96] := 159;
    LookUpTable[97] := 158;
    LookUpTable[98] := 157;
    LookUpTable[99] := 156;
    LookUpTable[100] := 155;
    LookUpTable[101] := 154;
    LookUpTable[102] := 153;
    LookUpTable[103] := 152;
    LookUpTable[104] := 151;
    LookUpTable[105] := 150;
    LookUpTable[106] := 149;
    LookUpTable[107] := 148;
    LookUpTable[108] := 147;
    LookUpTable[109] := 146;
    LookUpTable[110] := 145;
    LookUpTable[111] := 144;
    LookUpTable[112] := 143;
    LookUpTable[113] := 142;
    LookUpTable[114] := 141;
    LookUpTable[115] := 140;
    LookUpTable[116] := 139;
    LookUpTable[117] := 138;
    LookUpTable[118] := 137;
    LookUpTable[119] := 136;
    LookUpTable[120] := 135;
    LookUpTable[121] := 134;
    LookUpTable[122] := 133;
    LookUpTable[123] := 132;
    LookUpTable[124] := 131;
    LookUpTable[125] := 130;
    LookUpTable[126] := 129;
    LookUpTable[127] := 128;
    LookUpTable[128] := 127;
    LookUpTable[129] := 126;
    LookUpTable[130] := 125;
    LookUpTable[131] := 124;
    LookUpTable[132] := 123;
    LookUpTable[133] := 122;
    LookUpTable[134] := 121;
    LookUpTable[135] := 120;
    LookUpTable[136] := 119;
    LookUpTable[137] := 118;
    LookUpTable[138] := 117;
    LookUpTable[139] := 116;
    LookUpTable[140] := 115;
    LookUpTable[141] := 114;
    LookUpTable[142] := 113;
    LookUpTable[143] := 112;
    LookUpTable[144] := 111;
    LookUpTable[145] := 110;
    LookUpTable[146] := 109;
    LookUpTable[147] := 108;
    LookUpTable[148] := 107;
    LookUpTable[149] := 106;
    LookUpTable[150] := 105;
    LookUpTable[151] := 104;
    LookUpTable[152] := 103;
    LookUpTable[153] := 102;
    LookUpTable[154] := 101;
    LookUpTable[155] := 100;
    LookUpTable[156] := 99;
    LookUpTable[157] := 98;
    LookUpTable[158] := 97;
    LookUpTable[159] := 96;
    LookUpTable[160] := 95;
    LookUpTable[161] := 94;
    LookUpTable[162] := 93;
    LookUpTable[163] := 92;
    LookUpTable[164] := 91;
    LookUpTable[165] := 90;
    LookUpTable[166] := 89;
    LookUpTable[167] := 88;
    LookUpTable[168] := 87;
    LookUpTable[169] := 86;
    LookUpTable[170] := 85;
    LookUpTable[171] := 84;
    LookUpTable[172] := 83;
    LookUpTable[173] := 82;
    LookUpTable[174] := 81;
    LookUpTable[175] := 80;
    LookUpTable[176] := 79;
    LookUpTable[177] := 78;
    LookUpTable[178] := 77;
    LookUpTable[179] := 76;
    LookUpTable[180] := 75;
    LookUpTable[181] := 74;
    LookUpTable[182] := 73;
    LookUpTable[183] := 72;
    LookUpTable[184] := 71;
    LookUpTable[185] := 70;
    LookUpTable[186] := 69;
    LookUpTable[187] := 68;
    LookUpTable[188] := 67;
    LookUpTable[189] := 66;
    LookUpTable[190] := 65;
    LookUpTable[191] := 64;
    LookUpTable[192] := 63;
    LookUpTable[193] := 62;
    LookUpTable[194] := 61;
    LookUpTable[195] := 60;
    LookUpTable[196] := 59;
    LookUpTable[197] := 58;
    LookUpTable[198] := 57;
    LookUpTable[199] := 56;
    LookUpTable[200] := 55;
    LookUpTable[201] := 54;
    LookUpTable[202] := 53;
    LookUpTable[203] := 52;
    LookUpTable[204] := 51;
    LookUpTable[205] := 50;
    LookUpTable[206] := 49;
    LookUpTable[207] := 48;
    LookUpTable[208] := 47;
    LookUpTable[209] := 46;
    LookUpTable[210] := 45;
    LookUpTable[211] := 44;
    LookUpTable[212] := 43;
    LookUpTable[213] := 42;
    LookUpTable[214] := 41;
    LookUpTable[215] := 40;
    LookUpTable[216] := 39;
    LookUpTable[217] := 38;
    LookUpTable[218] := 37;
    LookUpTable[219] := 36;
    LookUpTable[220] := 35;
    LookUpTable[221] := 34;
    LookUpTable[222] := 33;
    LookUpTable[223] := 32;
    LookUpTable[224] := 31;
    LookUpTable[225] := 30;
    LookUpTable[226] := 29;
    LookUpTable[227] := 28;
    LookUpTable[228] := 27;
    LookUpTable[229] := 26;
    LookUpTable[230] := 25;
    LookUpTable[231] := 24;
    LookUpTable[232] := 23;
    LookUpTable[233] := 22;
    LookUpTable[234] := 21;
    LookUpTable[235] := 20;
    LookUpTable[236] := 19;
    LookUpTable[237] := 18;
    LookUpTable[238] := 17;
    LookUpTable[239] := 16;
    LookUpTable[240] := 15;
    LookUpTable[241] := 14;
    LookUpTable[242] := 13;
    LookUpTable[243] := 12;
    LookUpTable[244] := 11;
    LookUpTable[245] := 10;
    LookUpTable[246] := 9;
    LookUpTable[247] := 8;
    LookUpTable[248] := 7;
    LookUpTable[249] := 6;
    LookUpTable[250] := 5;
    LookUpTable[251] := 4;
    LookUpTable[252] := 3;
    LookUpTable[253] := 2;
    LookUpTable[254] := 1;
    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:00273