ゴッホが日本の浮世絵を見て,日本には影がないと思ったらしいですが,まさに影がなくなるフィルタです.全体的に明るい画像となりますが,エッジが多い細かな画像には向かないようです.
影の部分はある程度の面積をもった同じような色の領域ですので,微分フィルタを明度に対して行えば似たいような色が続けば値はゼロになります.この部分が明るくなれば良いので255から引いてみます.そうすればエッジ部分では暗くなり,その他では明るい画像ができあがります.ただし,真黒なピクセル(RGB共にゼロ)の値はHSVに変換時に彩度をゼロにしているので明度を上げても白になりますが,微妙に真黒では無かった場合明度を上げると若干意図しない色が付きます.
RGBのときに使用したSobelフィルタとLaplacianフィルタを明度に対して適用する関数を作成したいと思います.RGBのときと同様Sobelフィルタの方がエッジ部分が太くなり,メリハリのある感じで,Laplacianフィルタはぼんやりした雰囲気になります.
nextvalue = abs((double)sumv); nextvalue = 255 - nextvalue; nowvalue = temp->hsv[i*temp->width + j].v; nextvalue = (1 - ratio)*nextvalue + ratio*nowvalue; nextvalue = nextvalue > 255 ? 255 : nextvalue; nextvalue = nextvalue < 0 ? 0 : nextvalue; temp->hsv[i*temp->width + j].v = nextvalue;
フィルタ自体はRGBのときとかわっていません.また,SobelとLaplacianの両方を追加していますが,上の部分は一行目で絶対値をとっているか,積和の平方根をとるかの違いだけで全く同じです.また,2行目は上で説明した通り明るさを反転させています. 5,6行目は明度の範囲を越えたものを丸めています.明度が強制的に最大付近になるのも考え物なので,関数の引数で元の画像の明度をどの程度残すかという割合を0から1で指定出来るようにしています.