グレースケール画像にカラー線を乗せてカラー画像に見せる

 数日前にちょっと話題になっていた以下の件を再現したり、追加実験してみました。
「ホントに白黒だった」ただの白黒写真に色の付いた線を引くだけでカラーに見える技術がスゴい→その仕組みは…? - Togetter
【やじうまPC Watch】フルカラーに見えるこの動画、じつはほぼモノクロ - PC Watch

 togetterもImpressも元ネタはØyvind Kolås氏のようです。
https://www.patreon.com/posts/color-grid-28734535
 

はじめに

 これを見たときの個人的な印象は、「面白い!」と「それほど驚くことも無い」の半々といった感じでした。というのも、人間の視細胞は光の明暗を感じる細胞と、色を感じる細胞の2種類に大別され、色を感じる細胞は明るさを感じる細胞よりかなり少ないということを知っていたからです*1
 光の明暗を感じる細胞のことを桿体細胞(かんたいさいぼう; Rod cell)、色を感じる細胞を錐体細胞(すいたいさいぼう; Cone cell)と言いますが、それぞれの数はどの位違うのか改めて調べてみると、ジョージア州立大学のサイトに以下のように記載されています。

The rods are more numerous, some 120 million, and are more sensitive than the cones. However, they are not sensitive to color. The 6 to 7 million cones provide the eye's color sensitivity and they are much more concentrated in the central yellow spot known as the macula.

The Rods and Cones of the Human Eye
 すなわち、桿体細胞が約1億2千万個に対して錐体細胞が6~7百万個であることから、視細胞の約95%は桿体細胞で色を感知せず明るさだけを感知し、残りの約5%だけで色成分を感知していることになります。
 それならば、普通のカラー画像では全てのピクセルがRGB各成分のカラー情報を持っていますが、画像を構成するピクセルのうち最大95%まではカラー情報を捨てたグレースケールとし、残りの5%のピクセルだけにカラー情報を残せば全体としてカラーっぽく見えるのではないかという仮説が思いつきます*2
 

再現実験

 とりあえず、公開されている画像から元画像を調べて、同じような加工を施してみます。
 Chuwa (Francis) 氏がCC BY-SA 2.0ライセンスで公開している2011-07-12-Railway Peopleという画像が元画像の一つのようですので、利用させていただきます。
2011-07-12-Railway People | Chuwa (Francis) | Flickr

 Øyvind Kolås氏の加工と同じような加工を適当に再現したものが以下になります。
f:id:kachine:20190802231924p:plain

 これはImageMagickを使えばコマンド一発で作れます。

convert in.jpg ( -clone 0 -modulate 100,450,100 ) ( -clone 0 -colorspace gray ) ( -size 334x223 -resize 300% pattern:HORIZONTAL ) -delete 0 -composite out.png

 入力画像の彩度を450%*3にした画像と、入力画像をグレースケール変換した画像を、水平線画像*4をマスクとして合成せよというコマンドです。
 線幅・線の間隔・色味が微妙に違いますが、再現したいことそのものは実現できていると判断して良いでしょう。
 

いろいろ試す

パターン

 自前の画像で水平線以外のパターンではどう見えるのか試してみます。

HORIZONTAL
f:id:kachine:20190802233854p:plain
VERTICAL
f:id:kachine:20190802233819p:plain
HORIZONTALSAW
f:id:kachine:20190802233449p:plain
VERTICALSAW
f:id:kachine:20190802233801p:plain
RIGHT30
f:id:kachine:20190802233713p:plain
RIGHT45
f:id:kachine:20190802233740p:plain
LEFT30
f:id:kachine:20190802233541p:plain
LEFT45
f:id:kachine:20190802233604p:plain
BRICKS
f:id:kachine:20190802233313p:plain
HEXAGONS
f:id:kachine:20190802233421p:plain
OCTAGONS
f:id:kachine:20190802233628p:plain

 主観ではどれもカラー画像に見えなくもありません*5。BRICKS、HEXAGOS、OCTAGONSのように水平垂直両方向のカラー成分があるより、一定方向の線だけの方が目障りではないように感じます。個人的にはLEFT30及びRIGHT30が最も目障りではなく、自然なカラー画像に近いように感じます*6
 

カラー成分を残すピクセル比率を指定

 ここまではImageMagickの組み込みパターンをそのまま流用していましたが、カラー成分を残すピクセルの比率を指定するため自力でパターンを定義してみます。
 簡便のため格子(グリッド)パターンとし、そのグリッド間隔を変えることで、カラー成分を残すピクセル比率とします。なお、下表のN=40辺りのグリッドが約5%のピクセルをカラーとして残せるので、冒頭に記した単純計算した視細胞中の錐体細胞の比率に相当しますので、カラー画像らしく見えるのか見どころです。

N*7 グリッド線が占める比率*8
2 75.00%
3 55.56%
4 43.75%
5 36.00%
6 30.56%
7 26.53%
8 23.44%
9 20.99%
10 19.00%
11 17.36%
12 15.97%
13 14.79%
14 13.78%
15 12.89%
16 12.11%
17 11.42%
18 10.80%
19 10.25%
20 9.75%
21 9.30%
22 8.88%
23 8.51%
24 8.16%
25 7.84%
26 7.54%
27 7.27%
28 7.02%
29 6.78%
30 6.56%
31 6.35%
32 6.15%
33 5.97%
34 5.80%
35 5.63%
36 5.48%
37 5.33%
38 5.19%
39 5.06%
40 4.94%
41 4.82%
42 4.71%

 実際に格子間隔を変えて生成した画像をGIF化すると以下の通り。
f:id:kachine:20190803001055g:plain
 約95%のピクセルがグレースケール化されていると、さすがにカラー画像には見えません。すなわち、単純に5%のカラー画素が画像中に均一に存在すればカラー画像として知覚されるわけではないことが解ります。このことからも、間接的に桿体細胞と錐体細胞の分布は一様ではないということが察せられますね。
 

何に使えるの?

 興味深い現象ではあるのですが、これは実際に何かに有益に使えるのか考えてみます。

ファイルサイズ削減に使える?

 グレースケール画素が大半を占めるのなら画像ファイルサイズが削減できるのでは?と思うかもしれませんが、JPEG画像のサイズは大きくなります。なぜならば線やグリッドなどのパターンが元画像に追加されるわけですから、空間周波数成分が余計に増えます。故に保持すべき情報量が増えてファイルサイズは大きくなります。
 また、JPEG圧縮は非可逆圧縮であることは多くの方がご存じだと思いますが、JPEG圧縮後にはグレースケール化した画素にも実はカラー情報が僅かに溢れてしまいます。グレースケール化した画素を真にグレースケール画素として維持するためにはPNGTIFFなどの可逆圧縮形式を使う必要がありますが、写真のような画像では一般にJPEGよりファイルサイズは大きくなります。
 故に、既存の画像フォーマットでファイルサイズ削減のためには使えません。
 

プリンタのカラーインク節約に使える?

 カラー印刷時に黒インクを使わないタイプの廉価モデルでは節約になりません(カラーインクを混ぜて黒を作るため)。カラー印刷時にも黒インクを使うタイプのプリンターであれば、カラーインクの節約につながる可能性はありますが、元画像データのピクセルとプリントヘッドが吐出するインクの最小単位が一致していないと、結局カラーインクが使われるかもしれません。要するに、プリンタの印字解像度に合わせて元画像データを縮小処理したりする過程で、周辺画素との演算が発生しカラー成分が乗ってくる可能性があります。プリンタドライバが画像データをこねくり回してしまうと思われるので、一般ユーザが狙ってやるのは困難だと思います。
 プリンタメーカーがカラーインク消費量を削減できる機能として、プリンタドライバ側に実装してくれると便利かもしれませんね。写真メインではなくビジネス文書をターゲットに、カラートナー消費量削減機能として訴求すれば顧客の興味を引くような気がします。
 

じゃぁ、何に使えるの?

 個人レベルで有用な例は…あまり無いと思います。

 が、画像中にグレースケール化されたピクセルが多少存在しても気づかないという視覚の特性は、簡易的な電子透かしとして機能すると思います。
 画像ファイルのメタデータ著作権情報を付加しても、不正盗用する輩はメタデータを捨てて無視するでしょう。不正盗用対策として、画像に直接的に著作権情報等を書き入れてあるとその文字は作品の邪魔になります。ので、著作権情報をグレースケール化した画素として挿入すれば、作品の邪魔になりにくいのではないかと思います。
 実際に電子透かしもどきを埋め込んでみましたが、お判りでしょうか?
f:id:kachine:20190803005016p:plain
 電子透かしもどきを埋め込むのはImageMagickで以下のように行えます。

convert input.jpg ( -clone 0 -colorspace gray ) ( -size 640x360 xc:none -pointsize 32 -fill white -gravity center -annotate +0+0 "Copyright kachine\nAll rights reserved." -edge 1 ) -composite engraved.png

 逆に、この画像から電子透かしもどきを検出すると、以下のような画像が得られます。
f:id:kachine:20190803005133p:plain
 電子透かしもどきの検出はImageMagickで以下のように行えます。グレースケール画素はRGB各成分が同値であることを利用しています*9

REM Green-Red成分を比較(グレースケール画素は差分が無いので0/黒になる)
convert engraved.png ( -clone 0 -channel G -separate ) ( -clone 0 -channel R -separate ) -delete 0 -compose difference -composite GR.png
REM Green-Blue成分を比較
convert engraved.png ( -clone 0 -channel G -separate ) ( -clone 0 -channel B -separate ) -delete 0 -compose difference -composite GB.png
REM Red-Blue成分を比較
convert engraved.png ( -clone 0 -channel R -separate ) ( -clone 0 -channel B -separate ) -delete 0 -compose difference -composite RB.png
REM 各チャネルの差分画像を加算し、差分がある画素は黒、無ければ白にする
convert GR.png GB.png RB.png -compose Add -composite -fx p?rgb(0,0,0):rgb(255,255,255) dif.png

 



以上。

*1:加えてドットバイドット表示ではなく、縮小表示されている画像はアルゴリズムにも依りますが周辺ピクセルと平均されるため、縮小画像はカラー化されるでしょうし。

*2:が、実際には上記に引用したジョージア州立大学のサイトにも記載があるように、錐体細胞の多くは網膜の中央部に集中して存在しており、桿体細胞と錐体細胞が均一に一様な比率で存在しているのではありません。故に、単純に5%のピクセルにだけ色を残してもカラー画像として認識できないのではないかとも予測できます。

*3:グレースケール画像は彩度が無いため、カラー部分の彩度を高める調整しないと合成後に淡い画像に見えてしまうため、適当に彩度を上げています。

*4:ImageMagickのプリセットパターンでは水平線間隔が狭いので、適当に3倍に荒くしています。

*5:ディスプレイと目の距離や、凝視するかぼーっと見るか、等によって見え具合は変わってきますが。

*6:人間の目は水平垂直線には敏感でも、斜線には鈍感みたいな話もあった気がするので、その辺も影響しているのかも知れません。

*7:Nピクセル毎に1pxのグリッド線を描画

*8:カラー成分として残すピクセル比率

*9:ですので、JPEGの場合はカラー成分のノイズが乗ってくるのでここまで厳密には検出できません。