mattintosh note

どこかのエンジニアモドキの備忘録

ImageMagickでLabに変換してLチャンネルにだけアンシャープをかけたい

ほとんどの人は写真にシャープネスフィルタをかけるとき、RGB のままでフィルタを適用すると思う。自分もカメラを始めた頃は普通に RGB のままでかけていた。んで昔、どっかのサイトで「Photoshop でアンシャープをかけるならカラースペースを Lab に変換して L チャンネルにだけシャープネスフィルタをかける」というのを見かけて仕上がりが綺麗だったのでそれ以降はずっと LAB 変換 -> アンシャープ -> RGB 変換 という工程を行っていた。

暫くして Linux に移行して Photoshop とサヨナラしたので GIMP を使っているのだけどこの操作をやろうとするとなかなか面倒くさい。というか Linux を使っているのだからもっと楽にやりたい。そこでこの工程を ImageMagick で出来ないものかとやってみた。

まずはオリジナルの画像。はてなブログに上げた時点で原寸ではなくなってるのだろうけどそこは仕方がない。

f:id:mattintosh4:20200209005258j:plain
オリジナル

Lab カラーとは簡単に言うと明るさと色を2系統に分けたカラーモデル。詳しくは Wikipedia でどうぞ。

f:id:mattintosh4:20200209005549j:plain
Lab - L

f:id:mattintosh4:20200209005621j:plain
Lab - a

f:id:mattintosh4:20200209005634j:plain
Lab - b

これらの画像は -colorspace Lab にした後、-separate で分解すれば出力出来る。

convert input.jpg -quality 100 -colorspace Lab -separate output.jpg

まずはリサイズするわけだけど ImageMagick の公式ドキュメントに RGB に変換してからリサイズを行うテクニックが紹介されている。これは知らなかった。

Resizing or Scaling -- IM v6 Examples

convert earth_lights_4800.tif -resize 500 earth_lights_direct.png
convert earth_lights_4800.tif -colorspace RGB -resize 500 -colorspace sRGB earth_lights_colorspace.png

f:id:mattintosh4:20200209014030p:plain
RGB 変換なし

f:id:mattintosh4:20200209014052p:plain
RGB 変換あり

というわけでここではこのリサイズ方法も含めてテストする。

まずは普通に sRGB でリサイズ。

convert input.jpg -quality 100 -filter Lanczos2 -colorspace sRGB -resize 800 output.jpg

f:id:mattintosh4:20200209005319j:plain
sRGB リサイズ

続いて RGB に変換してからリサイズ。ImageMagick のサンプル同様、元画像より若干明るい。

convert input.jpg -quality 100 -filter Lanczos2 -colorspace RGB -resize 800 -colorspace sRGB output.jpg

f:id:mattintosh4:20200209005345j:plain
RGB リサイズ -> sRGB

次にアンシャープフィルタのテスト。まずは普通にかける。

convert input.jpg -quality 100 -filter Lanczos2 -colorspace RGB -resize 800 -unsharp 1x1+1+0 -colorspace sRGB output.jpg

f:id:mattintosh4:20200209005423j:plain
RGB リサイズ -> アンシャープ

で、最後に Lab アンシャープ。

convert input.jpg -quality 100 -filter Lanczos2 -colorspace RGB -resize 800 \
-colorspace Lab -separate \( -clone 0 -unsharp 1x1+1+0 \) -swap 0 +delete -combine -set colorspace Lab \
-colorspace sRGB output.jpg

f:id:mattintosh4:20200209005455j:plain
RGB リサイズ -> Lab アンシャープ

4枚を並べてみる。Lab アンシャープが最も明るい印象。

f:id:mattintosh4:20200209005955j:plain

並べてみてもわかりづらいので GIF アニメーションにしてみる。色空間変えてリサイズやアンシャープフィルタをかけるだけでここまで違う(素材によるだろうけど)。

f:id:mattintosh4:20200209015422g:plain

Lab 化の部分についての補足

Lab に変換したあとに -separate で内部的に画像を分割することで L チャンネルにのみフィルタを適用することが出来、一時ファイルを作成する必要も無い。

-colorspace Lab -separate \( -clone 0 -unsharp 1x1+1+0 \) -swap 0 +delete -combine -set colorspace Lab

まずこの部分で入力ソースが L、a、b の 3 つに分割される。

-colorspace Lab -separate

で、-clone 0 で L を複製してアンシャープフィルタをかける。

\( -clone 0 -unsharp 1x1+1+0 \)

この時点で内部的に L、a、b、L の 4 つのソースが存在する。最初の L と最後の L を -swap 0 で入れ替えて、一番最後のソースを +delete で削除する。

-swap 0 +delete

分割されているものを -combine で結合する際にカラースペースを Lab として指定する。

-combine -set colorspace Lab

あとは sRGB に変換したらおしまい。