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への変換と復元
スポンサーリンク
関連記事
前の記事: | RGBカラー交換のサンプルコード |
次の記事: | 輪郭のトレースのサンプルコード(画像フィルター) |
公開日:2015年02月25日
記事NO:00300