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
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









