TOP > カテゴリ > 画像処理工学 >

HSVカラー調整のサンプルコード

画像に「HSVカラー調整」の処理をするサンプルです。Hは色相(Hue)、Sは彩度(Saturation)、Vは明度(Value)となります。ソースコードはDelphi5で作成しましたがその他の言語でも流用できるかと思います。

画像処理の結果

HSVカラー調整をすると下図のようになります。(H+40,S+0,V+0)

ソースコード

[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.

[HSVカラー調整の関数]

/////////
// RGB → HSV変換
procedure RGBToHSV (const R,G,B: Double; var H,S,V: Double);
var
  dMin,dMax : Double;
  diff      : Double;
begin
  // Min,Maxを求める
  dMin := MinValue( [R, G, B] );
  dMax := MaxValue( [R, G, B] );

  // 差分を求める
  diff := dMax - dMin;

  // 明度(Value) = (MAX)
  V := dMax;

  // 明度が0ならば色相(Hue), 彩度(Saturation)も0となる
  if (V = 0) then
  begin
    H := 0;
    S := 0;
    Exit;
  end;

  // 彩度 (MAX-MIN)/MAX
  S := diff / dMax;

  // 色相
  if (diff <> 0) then
  begin
       if (dMax = R) then H := (60.0 * (G - B) / diff);
       if (dMax = G) then H := (60.0 * (B - R) / diff) + 120;
       if (dMax = B) then H := (60.0 * (R - G) / diff) + 240 ;
  end
  else
     H := 0;

  if H < 0.0 then H := H + 360;
end ;

/////////
// HSV → RGB変換
procedure HSVtoRGB (H,S,V: Double; var R,G,B: Double);
var
  f,p,q,t : Double;
  i : Integer;
begin
  // 彩度(Saturation)が0の場合は無色 or 灰色で(R=G=B=V)となる
  if S = 0.0 then
  begin
      R := V;
      G := V;
      B := V;
      Exit;
  end;

  if H = 360 then H:=0;

  i := Trunc(H / 60);
  f := (H / 60) - i;

  p := V * (1 - S);
  q := V * (1 - (S * f));
  t := V * (1 - (S * (1 - f)));

  case i of
    0: begin R := V; G := t; B := p  end;
    1: begin R := q; G := V; B := p  end;
    2: begin R := p; G := V; B := t  end;
    3: begin R := p; G := q; B := V  end;
    4: begin R := t; G := p; B := V  end;
    5: begin R := V; G := p; B := q  end
  end
end ;

//-----------------------------------------------------------------------------
//■関数    EffectHSVColor_Adjustment
//■用途   HSVカラー調整
//■引数     hBMP  ... 転送元のビットマップのハンドル
//           色相(Hue)        ... 加算する値(0.0~360.0)
//           彩度(Saturation) ... 加算する値(0.0~1.0)
//           明度(Value)      ... 加算する値(0.0~1.0)
//■戻り値
//            新しいビットマップのハンドル
//-----------------------------------------------------------------------------
function EffectHSVColor_Adjustment(hBMP :HBitmap ; dH,dS,dV: Double):HBitmap;
var
  Row,Col : Integer;
  SrcRow,DestRow : pRGBArray;
  SrcBitmap,DestBitmap : TBitmap;
  H,S,V,R,G,B : Double;
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

         // RGBからHSVへ変換
         RGBToHSV(SrcRow[Col].rgbtRed   / 255,
                  SrcRow[Col].rgbtGreen / 255,
                  SrcRow[Col].rgbtBlue  / 255,H,S,V);

         H := H + dH;
         S := S + dS;
         V := V + dV;

         // 範囲チェック
         if (H>360) then     H := 360
         else if  (H<0) then H := 0;

         if (S>1) then       S := 1
         else if  (S<0) then S := 0;

         if (V>1) then       V := 1
         else if  (V<0) then V := 0; 

         // HSVからRGBへ変換
         HSVtoRGB(H,S,V,R,G,B)  ;

         DestRow[Col].rgbtRed   := set255(Round(R*255));
         DestRow[Col].rgbtGreen := set255(Round(G*255));
         DestRow[Col].rgbtBlue  := set255(Round(B*255));
       end;
    end;

    Result:=DestBitmap.ReleaseHandle;
  except
    Result:=SrcBitmap.ReleaseHandle;
  end;

  SrcBitmap.Free;
  DestBitmap.free;
end;

[関数の呼び出し]

procedure TForm1.Button1Click(Sender: TObject);
begin
    Image1.Picture.Bitmap.Handle :=
      EffectHSVColor_Adjustment(Image1.Picture.Bitmap.ReleaseHandle,40,0,0);
end;

参考サイト

この記事は下記のサイトを参考に致しました。感謝。

HSV色空間
Visual C++ 2010 Expressを用いた易しい画像処理(3)
RGBからHSVへの変換と復元





関連記事



公開日:2015年02月25日
記事NO:00300