はじめに
この記事は、「OpenCVにて、imread()で読み込んだ画像の色空間をBGRからHSVに変換した後、imshow()で表示する」といった処理をする前提で書いています。
「元画像とHSV変換後の画像を人間の目で見比べた際に、どのような色の違いが見て取れるか」ということに関して書いています。
動作環境
Python 3.7.0
VS Code: August 2018 (version 1.27)
opencv-python: 3.4.3.18
OpenCVの知識(この記事を読む上で知っておいてほしいこと)
- 前提としてOpenCVのimread()で読み込んだ画像の色空間はBGRであるということ。(一応)
- OpenCVのHSV空間の値の範囲は下記のようであるということ。(下記URLより引用)
H
0~180の範囲。Hueは本来0~360だがOpenCVではH/2の値を示す。181~255の範囲は0からの循環に回される。
S
0~255の範囲。255がS=1.0に相当。
V
0~255の範囲。255がV=1.0に相当。
[引用元]http://d.hatena.ne.jp/Kazzz/20130118/p1
- Hの値と色相の対応関係はこちらのサイトの画像が分かりやすいです。
[参考]http://www.cellstat.net/color/3/
変換前後での色の比較
下記参考サイトのページ中央下部「(2) HSVによる色抽出」より引用すると、
「BがH値、GがS値、RがV値になっています。よって、暗いところほど赤くなったりしているのがわかると思います。」
とあり、同時に同サイトの参考画像の土の部分は、元画像が茶色(黒)に対してHSV変換後の画像では緑になっている。
[参考]http://tecsingularity.com/opencv/colorextraction/
事象
ここで、例えば「橋の影は暗いのに緑になる!赤くない!(下図参考)」なんてことがあったので、これについて考えました。
ポイントは「黒い」か「暗い」か
「暗いと赤い」「黒いと緑」という仮説を立てました。
また、HSVのHの値と色の対応表(上記参考URL参照)より、赤の反対は水色と、緑に近いことがわかります。
更に、当然ですが、暗いの反対は明るい、黒の反対は白です。
つまり橋の影は、明るさに限らず影の下にある物の色が黒(HSVでいうとSが0に近い)で、影の明るさがまあまあ(HSVのVが180に近い)の場合は、「限りなく黒く、ほどほどに暗い」ため、「変換前後での色の比較」で挙げた「暗いところほど赤くなったりしている」ことを前提に考えると「限りなく緑で、ほどほどに赤い」ことになる。つまり緑。
と、そう思った。
間違ってました。
そもそも、RGB空間では「明るいか暗いか」なんて知ったこっちゃないんですよね。
RGB空間では彩度(HSVのS)明度(HSVのV)など管理しておらず、「明るく見えるものは白に近い。暗く見えるものは黒に近い」ただそれだけ。その証拠に下の画像は、木の影の下にある道路は白に近いにも関わらず、HSV空間へ変換後の画像の同部分は緑になっています。
結論
明るさに限らず、RGB画像で明るく白く見えるところはHSVでは赤い。暗く黒く見えるところは緑。(あたり前田のクラッカー)
まあつまりは、RGBからHSVに変換した後、RGB画像の暗い部分と黒い部分の区別をするマスクを作成する際、色指定だけでは難しいねやっぱりということ。(あたり前田のクラッカー)
以上。