内容が古くなっている場合があります。
難易度
この記事はJPEG圧縮による画像劣化、元画像からの変化を最小限にする方法を考察しています。画像を扱うソフトウエアは様々ですが、代表的かつ標準的なものにPhotoshopがあります。このためRAW現像後の画像の解像度を調整したり、特定の目的にあわせて調整する際Photoshopを使用している人が多いはずです。しかし書き出したJPEG画像の劣化が気になる例が頻繁にあり、原因はPhotoshopがJPEG圧縮で4:4:4法を使用していないからだと結論するに至りました。JPEGの概念、画質劣化の原因、解決策をまとめます。
これまでに何度かJPEG圧縮の弊害を記事として取り上げてきた。
JPEG圧縮は不可逆圧縮で、データを間引いて容量を減らすため元データと一致しない画像になる。人間の感覚のうち差の違いに鈍感な部分を間引く設計だが、元画像の性質や圧縮率の設定次第でははっきり違和感が現れるし、美的と言い難い画像になる。
圧縮率をあげることでブロックノイズや汚い塊が発生するのは遠い過去から散々指摘されてきたことだが、最近はこのほかにグラデーションが段付きになって現れたり色浮きが現れているケースをさまざな媒体で見かけることが増えた。
高画素かつビット深度が深いデータを取れるカメラ、こうしたハイスペックで大容量のデータを扱える環境がごく普通のものになったのが、過去の少ない画素数と浅いビット深度の写真を扱っていた時代との違いによる変化だ。またいまどき縦横500〜600pixel程度の小さな画像をアップロードしたり交換することは稀で、一片2000から4000pixel程度またはそれ以上のデータを扱うときどうしても容量が気になって圧縮率が高まるのも要因かもしれない。このうちアップロード先の再圧縮については後述する。
ポートレイトの無地の背景がバームクーヘンやドーナッツのように同心円の段々になっているのをSNSの投稿や低品質な広告で見かけたことはないだろうか。
これまでの記事で使用してJPEG圧縮による段付きと色浮きの実例・模式図を以下に示す。
こうした段々や色浮きは高圧縮するだけでも発生するが、RAW現像時に彩度を下げたり、コントラストや応答特性(ガンマ値)を操作することで顕著になる場合が多い。濃度と色の差と関わりが深いのである。
概念
私たちはデジタル画像とはR(赤)・G(緑)・B(青)の三原色で成り立っているのを知っているし、同時に常にこれだけで成立していると誤解しがちでもある。
JPEGでは、JPEGを生成する際にRGBデータをYCbCr(YUV)データに変換している。YCbCrは色空間、YUVはPAL信号用のコンポーネント信号を表している。
PAL? そうその通りテレビ放送のPAL方式のPALだ。モノクロ放送の時代からカラー放送へ切り替わる時期、カラー用のまったく新しい信号方式に変えると従来のモノクロ受像機は放送を映し出すことができなくなる。そこでモノクロ(輝度のみのデータ)を取り出せ、カラーのデータも転送する折衷的方式が策定された。
YCbCr=Yは輝度、CrCbのCbは青の色域、Crは赤の色域それぞれの色相と彩度情報を意味している。
青と赤でフルカラーが表現できるだろうか? という問いがあってとうぜんだ。RGBでは各色のグラデーションは彩度も明度も低い黒へ近づいて行くが、青の反対の負の色として黄色方向、赤の負の色としてシアン方向があるという色空間がYCbCrなのだ。
このうちYの信号だけ使うと、前述したモノクロ受像機であっても従来通りモノクロの状態で放送が視聴できた。これはデジタルにもいえ、YCbCrのうちYデータのみ取り出せばモノクロ(輝度の変化だけの記録)をディスプレイに映し出すことができる。
このような独特の色空間をJPEGは圧縮に使用している。
なぜテレビ放送で策定された色空間を使うのか。それは輝度と色の情報を分離できるからにほかならない。
原因
JPEG圧縮では、Yの輝度情報ではなくCrCbの色差情報(色の違いの情報)を間引いて容量を小さくする。色と色の差が小さいとき、これらをひとつの色に丸めれば、個々の色の情報を抱えこむより容量は小さくなる。雑な表現をすれば、赤、少しだけ淡い赤、少しだけ濃い赤を、すべて「赤」にすればざっと1/3になるということだ。
人(または哺乳類)は輝度情報への感度にくらべて色の識別能力がとても低い視覚特性をもっている。夜行性動物だった時代の名残で多くの哺乳類が色をフルカラーで識別できず、明暗差を重視しているのに由来しているのだ。これを利用してJPEGはデータを不可逆圧縮している。
YCbCrの色情報の間引きにはいくつか規格がある。
画像の1画素ずつの情報の並びを見て行く。
YUV444
<[Y] [Cb] [Cr] ><[Y] [Cb] [Cr] ><[Y] [Cb] [Cr] ><[Y] [Cb] [Cr] >
<[Y] [Cb] [Cr] ><[Y] [Cb] [Cr] ><[Y] [Cb] [Cr] ><[Y] [Cb] [Cr] >
Y=輝度情報もCb青 Cr赤の情報も各4サンプルとして扱う
すべての画素で輝度と色の情報を保持する。
YUV422
<[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]><[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]>
<[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]><[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]>
Y=輝度情報は4サンプル、Cb青 Cr赤は互い違いに省いて各2サンプルとして扱う
画素1つおきに色の情報を間引いて輝度の情報だけにしている。
YUV411
<[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]><[Y] [✖︎] [✖︎]><[Y] [✖︎] [✖︎]>
<[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]><[Y][✖︎] [✖︎] ><[Y] [✖︎] [✖︎]>
横に4画素ずつ組みをつくり、輝度と色の情報を保持するのは1画素のみで他は輝度情報だけにする。
YUV420
<[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]><[Y] [Cb] [Cr] ><[Y] [✖︎] [✖︎]>
<[Y] [✖︎] [✖︎]><[Y] [✖︎] [✖︎]><[Y] [✖︎] [✖︎]><[Y] [✖︎] [✖︎]>
横に4画素ずつ組みをつくる。1段目の画素の列は互い違いに色情報を間引く。2段目はすべて色情報を間引く。横4、縦2のセットで全体を圧縮する。
人は輝度の変化に敏感だから輝度情報は間引けない。鈍感な色情報を間引いてデータの容量を減らす。上記各方式の違いから、YUV444は画像劣化がすくないがデータの容量は大きくなりがちで、YUV420は劣化が目立たないうちは容量を劇的に減らせる優秀な方法となりうるが容易に画像が破綻する、ということが理解できるだろう。
JPEGは画像データの容量をいかに小さくするか、小さくできるかをテーマに策定され使われてきたフォーマットのためほとんどのソフトウエアは圧縮にYUV420を使用している。そのうえで、大概のソフトが圧縮率をスライダーで変更できるようにしているが無圧縮に近い「高画質」を選択しても一旦YUV420に変換されるのだから色差情報がめちゃくちゃになって例の段付きグラデーションが発生する。
これはPhotoshopも同じである。
紹介済みの劣化例は空の明暗差に同心円状の段付きが発生しているし、例示目的のグラデションバーの変化にも段がある。
空は空そのものも雲も明暗が複雑にからみあっている。急激に変化している部分もあれば、ゆっくり推移が変化している部分もある。さらに輝度だけでなく色も複雑で「空は青い」と一言で言えない色域・彩度の変化がある。
ここにレンズの周辺減光や、周辺減光に伴う色の変化も加わる。
撮影時やRAWデータを開いた段階では気にならず、現像時にコントラストや応答特性を調整してもディスプレイには正常な階調が映し出されているだろう。しかしJPEG書き出しすれば異常が発生し、TIFFやPSD形式で書き出したものをJPEGに変換してびっくりがっかりということになる。
なぜなら説明したように輝度情報はほとんどそのままJPEGに引き継がれているのに、複雑に変化する色の情報が420(4:2:0と表現することもある)と間引かれるのだから、なだらかな自然なグラデーションからかけ離れて段付きになるのだ。
とくにコントラストを落としたり応答特性を穏やかな逆S字などにした場合、階調(グラデーション)が微妙な差でなだらかにゆっくり変化する画像になる。彩度を落とした場合も、飽和していたり飽和に近い色にまるめられていたものが微妙な差を持つ色の違いになるし、飽和していない正常な色も変化がなだらかでゆっくりなものに変わる。
こうした複雑な情報を持つグラデーションから色の情報を大胆(というか無神経なくらいに)間引くのだから、420(4:2:0)ではまともな画像と言い難いものに成り果てるのである。
前掲のYUV444からYUV420の情報の間引きかたを見れば一目瞭然だ。ハイコントラストであったり高い彩度で飽和しているか飽和に近い色、変化がすくないベタ塗り調の色面は隣の画素から色の情報を取り除いてもたいして変化しないだろうが、微妙な変化を見せる階調と色の表現では大問題になる。
対策
MacOSには画像変換ソフトの大御所としてGraphicConverter🔗がある。
GraphicConverterはありとあらゆる画像形式を開くことができ、ありとあらゆる形式に保存できるソフトとして登場し、バッチ処理など微に入り細に入り対応している心強いソフトだが、画像調整の操作形式・操作方法・UIではPhotoshopがデファクトスタンダードであるし、なんでもできるから逆に使いかたがわからないという人も多いかもしれない。
また変換・保存ひとつとっても様々方法を選択できる点で、何を選んだらよいかわからないと敬遠する人だっているだろう。
しかし様々な手段や方法を選択できるのはJPEG変換も同様で、GraphicConverterではYUV444(ソフトウエア内の表示は4:4:4)が使え、仕上がりの差はYUV420を使用するソフトは別格である。
データの間引きが少ないから元画像に近い美しく自然な仕上がりになるが、既に指摘したように書き出し保存した画像のデータ容量はYUV420より大きくなりがちだ。とはいえ大抵の場合大き過ぎて重すぎて扱いに困るというほどではない。あたりまえだが可逆圧縮のTIFFやPNGより容量は小さい。
またYUV420で画像が劣化するため圧縮率を下げるケース(それでも劣化が大きい)で、むしろ素性がいいYUV444(4:4:4)圧縮で圧縮率を探って最適なポイントを見つけるほうが容量が軽くなるか、YUV420より多少重くても効果との比較で有利になるのが通例だ。
この高画質JPEGはそのまま使うだけでなく、SNSやブログに投稿する素材としても優秀だ。SNSやブログのシステムによっては、サーバ側のストレージ容量の問題や処理、転送不可軽減のためアップロードされた画像を再圧縮する例がある。JPEGの二度掛け圧縮もあれば、WebPに変換圧縮されるものもある。こうなると不自然感がないYUV420であっても、再圧縮時に見られたものではない画像になったりする。
画像の扱いに慎重そうな作家がSNSに上げている画像に、段付きであるとか色が変質したおかしな領域があったりするが、これらの原因はYUV420でつくられたJPEGの再圧縮にあるのではないかと疑っている。もしかしたら最初から無頓着にSNS用の画像を生成しているのかしれないが。
YUV444(4:4:4)でJPEG化するソフトウエアはGraphicConverterに限らないだろうから、各自の環境にあったものを使用してみたらどうだろうか。
© Fumihiro Kato.
Unauthorized copying and replication of the contents of this site, text and images are strictly prohibited. All Rights Reserved.