非可逆圧縮の画像フォーマットとして有名です。圧縮するとどう劣化するのか、そしてそのメカニズムを紹介します。圧縮率をあげると以下のような現象が見られます。モスキートノイズ元画像(png)q=100q=80q=40q=20クオリティ1を下げると文字やその周りに汚れのようなノイズが発生しています。これはモスキートノイズやリンギングと呼ばれます。大きく色が異なる箇所付近に目立って発生します。ブロックノイズ元画像(png)q=100q=60q=40q=20なだらかだったグラデーションが、クオリティを下げると四角い形での歪みが見られるようになります。これはブロックノイズやブロック歪みと呼ばれています。元画像(png)q=20q=10q=5q=3さらにクオリティを下げると、グラデーションが荒くなり、色数が減っていきます。ブロック2に分割してそれぞれに対して圧縮処理を行います。そのため、圧縮による劣化はブロック単位で変わる事になり、ブロックの境界で劣化が目立つ事になります。これがブロックノイズとなって現れます。上の例でいうと、細かい劣化の目立つブロック(薄い赤い部分)と目立たないブロック(青い部分)の境界(赤い部分)で劣化が目立ちます。各ブロックに離散コサイン変換という変換を施した形式で保存しています。種類のパターンの組み合わせに分解されて表現されるようになります。例として「A」という文字の32x32(つまり4x4ブロック)の画像を離散コサイン変換します。変換後の64パターン左上からブレンドするとこうなるポイントとしては、以下のようになります。変換すると64種類のパターンに分解される64種類のパターンをブレンド3するとちゃんと元の画像になる左上のパターンは低周波成分と呼ばれ、ブロック全体の色を決めるのに使用します。一方で、右下のパターンは高周波成分と呼ばれ、ブロック内のより細かい色の変化を表現するのに使用します。ところで、離散コサイン変換を行うだけでは画像の劣化は起きません4。各パラメーターの値を近似値に丸めるため、それによって品質が劣化します。これを「量子化」と呼びます。指定する品質を設定した経験があるかもしれません。場合はほぼ正確な値を残すと思われますが、数値を下げると思い切った近似をするようになります。実はこの数字によってどのような近似を行うかはソフトウェア毎に異なります5。同じ品質の数値でもソフトウェアによっては劣化の仕方が変わります。パターン(周波数)毎に近似の強さを変える事ができます。上の図で言う左上の低周波成分を強く近似すると、ブロックの色がまんべんなく変わります。右や下のストライプや、右下のチェックのような高周波成分を近似すると、縞模様やチェックが浮き上がって来る事になります。これがモスキートノイズの原因になります。高周波のパターンが人間には判別しづらい事がわかっているので、多くのソフトウェアでは左上よりも右下を優先的に近似をします。いう色の表現方法を採用している事も関係しています。モスキートノイズ先ほどのモスキートノイズの画像を拡大してみます。画像は白と赤しか使ってないにもかかわらず、うっすらと青いノイズが見えるのではないでしょうか。表現している事から発生するものです。色を輝度(Y)と二軸の色差で表現します。それぞれの成分に対してブロック分割し、圧縮を行います。そのため、圧縮に伴う歪みは「輝度の歪み」と「色差の歪み」という形で発生します。輝度成分に対してモスキートノイズが発生すると、縞模様やチェック状の「輝度の歪み」が発生します。一方で色差成分に対してモスキートノイズが発生すると、縞模様やチェック状の「色差の歪み」が発生します。先ほどの画像で青いノイズが発生したのは、色差成分のモスキートノイズが原因です。上で説明した量子化による情報の切り落としの他に、色差の情報を落とす事があります。以下は品質を100の状態でPNGからJPEGに変換したものです。元画像(png)q=100最高品質にしたのにもかかわらず、緑と紫のチェックがグレー6になってしまいました。ストライプの部分もぼんやりと色がついているもののほぼグレーです。この劣化はクロマサブサンプリングと呼ばれる操作が行われているのが原因です。色差成分を縮小する事でデータ量を減らす方法で、人間が色の変化よりも明度の変化に敏感であることを活用しています。(横方向だけ間引く)などがあります。形式でサブサンプリングを行っています7。4:4:4(間引かない)4:2:04:2:2クロマサブサンプリングとブロックノイズJPEGのブロック化や離散コサイン変換の処理は、クロマサブサンプリングされたものに対して行われます。そのため、色差成分に関してはより広い範囲(4:2:2だと16x8、4:2:0だと16x16)でブロックノイズが発生します。以外のサイズに指定する事も可能です。↩︎グレーより明るい色でブレンドするとより明るくなり、暗い色でブレンドするとより暗くなる、といったブレンドになっています。実際には丸め誤差で小さな劣化が発生します。製品はこれとは別の独自の量子化ロジックを使っているようです。↩︎なおこの画像は色差の平均をとるとグレーになるように調整しています。エンコーダー(ImageMagickが使っているlibjpegだと思われます)が平均値をとってサブサンプリングを行っているため、このようになっています。写真の場合はこのように極端な色差の劣化が発生する事は少ないと思われます。↩︎この記事を書いた人:鷲田ルームクリップのアプリケーションエンジニア。