特定の色をシフトしてみる

寄稿:東條遼平

色相

まずは色相についてシフトしてみたいと思います.色相は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するように直しています.

Valid XHTML 1.1! home > コンピュータ > プログラミング >
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.3.29HTML convert time to 0.010 sec.