まずは色相についてシフトしてみたいと思います.色相は0から359度までの値を持っていますが,シフトさせたい範囲を決め,その中に入っているときだけシフトをするという風にすれば,例えば青空を夕日に変えようと思えば青は240度付近ですので, 240度からプラスマイナス何度かの間を範囲とし,その中に入っているときに 120度位シフトすれば空が赤く変わりそうです.
if(top <= bottom){ if(img->hsv[i*img->width + j].h <= top || img->hsv[i*img->width + j].h >= bottom){ img->hsv[i*img->width + j].h += degree; } }else{ if(img->hsv[i*img->width + j].h >= bottom && img->hsv[i*img->width + j].h <= top){ img->hsv[i*img->width + j].h += degree; } } if(img->hsv[i*img->width + j].h >= 360) img->hsv[i*img->width + j].h -= 360; if(img->hsv[i*img->width + j].h < 0) img->hsv[i*img->width + j].h += 360;
bottomが範囲の始点,topが範囲の終点です.ここで赤の部分をシフトしようとするとどうしても0度をまたぐ必要があるので例えば330度から30度までというような指定が出来なければなりません.そのためtopがbottom以下のときとそれ以外で分岐させています.後は結果が0度から359度の間に納まるようにしています.
これを大きくするとその名の通り画像があざやかになります.これも範囲を指定できるようにしておきましょう.ちなみに-255だけシフトさせると彩度は全てゼロになり,グレースケールになります.
これも範囲を指定できるようにしました.あまりマイナス方向にシフトしすぎると真黒になります.明るい部分を少しシフトすると艶のある画像になります.
ついでなので色相,彩度,明度に対し全てに範囲を指定し,全ての範囲に入っているときにHSV全てをシフトする関数を作ってみました.これで細かな指定ができます.ただCUIのプログラムではなかなか細かくしていできませんが.殆ど前述の関数を足し合わせたような関数ですが,範囲外だったときにcontinueするように直しています.