2012年09月05日 03:00 [Edit]

tips - GIMPでJPEGの蚊を退治して"PNG"化する

gimp-icon

このためだけにGIMPをインストールしておく価値あり。


可逆対非可逆

我々がふんだんに画像や音楽や動画をネットでやりとりできるのは、非可逆圧縮(Lossy compression)のおかげ。これがなかったらとうの昔にネットはパンクしています。静止画や音声はとにかく、動画ともなれば無圧縮ではネットどころかハードディスクすらついていけないほど。

たとえば以下の画像。片方が可逆圧縮(Lossless compression)のPNG、そしてもう片方が非可逆圧縮のJPEGで圧縮してありますが、どっちがどっちだかおわかりいただけますか?画像をクリックした先に1246x1635ピクセルの元画像があるのでそちらも確認してみてください。

ぱっと見た目にはまるで同じ画像に見えるのに、PNGの方は1.7MBあるのに対してJPEGの方は577KB。1/3程度のサイズで済んでいます。にも関わらず、なぜ「うぶんちゅ!」の作者様は

にてPNGをZipしたものを配布なさっているのでしょう。しかも単行本化されたのに!この場を借りて献本御礼

非可逆、つまり元の状態を戻せないからです。

JPEGでは避けられないモスキート・ノイズ

その代表的な問題が、これ。

モスキートノイズ - Wikipedia
モスキートノイズ (mosquito noise) は、デジタル画像圧縮画像(特にJPEG静止画およびMPEG動画)において輪郭部分や色の変化の激しい部分で起こる画像の乱れ(ノイズ)。

コントラストが強い文字などの周りに蚊が飛び回ったような跡がかすかに出てしまうのです。

こんな風に。

Compression artifact - Wikipedia, the free encyclopedia

「圧縮率を下げれば出ない」と思っている方、ちょっと拡大して見てください。

png jpeg

上のWikipediaの例も、右のの「うぶんちゅ」の例もどちらもquality=90の例で、かなり高画質より、つまり低圧縮率ぎみの設定です。それでも二倍程度の拡大でわかってしまうほど出てしまうのです。画素が見えないほど遠くから眺めるのであればとにかく、再利用していともなるとこれでは困ります。「うぶんちゅ!」の画像を再利用できたのもPNGでファイルを配布していたから。再び御礼。

しかしJPEGファイルしか手元になかったら、画像編集アプリを使って手でいちいち消していかなければならないのでしょうか?

魔法の杖 = Selective Gaussian Blur (選択的ガウスぼかし)

やっと本題にたどり着きました。

出来るのです。蚊の自動一斉退治が。

それも、無料どころかオープンソースなソフトウェアで。

GIMP - Wikipedia
GIMP(ギンプ、ジンプ、GNU Image Manipulation Program)は、GNU GPL の下で配布されているビットマップ画像編集・加工ソフトウェア(ペイントソフト)。

これでAdobe Photoshopなみに高機能で高額で、専門学校にでも通わないととても使いこなせない(もちろん私には無理)というであれば「できて」当然という感じもしますが、使うのはたった一つの機能、[選択的ガウスぼかし]。

普通のガウスぼかしは、こういう機能。

Gaussian blur - Wikipedia, the free encyclopedia
A Gaussian blur (also known as Gaussian smoothing) is the result of blurring an image by a Gaussian function. It is a widely used effect in graphics software, typically to reduce image noise and reduce detail.

「画像のノイズリダクションとディテール削減に用いられる」とあります。しかし前者は望むところでも後者は困る。これでは蚊を退治したはいいが掻きすぎて皮が全部剝けちゃうのと同じです。

ところが[選択的ガウスぼかし]は、必要なところだけぼかしてくれるのです。

2.4. 選択的ガウスぼかし...
他のぼかしフィルターとは対照的に 選択的ガウスぼかし... プラグインは満遍なく画像をぼかすことはありません。 画素にぼかしがかかるのはその付近の画素の値との差が指定された最大デルタ値を下回る場合に限ります。 つまりもともとコントラストが高い部分はデルタ値を上回りますのでぼかしがかからずコントラストは保たれます。 背景だけぼかしをかけて前面にある物体は良好に浮き立たせたい場合に使えます。 たった一度の処理で画像に深みを与えられます。

で、以下がその結果。

png jpeg blurred repaired

左から、元PNG、JPEG(quality=90)、ふつうのガウスぼかし、そして選択的ガウスぼかし。

半径を大きく取ればぼける(周囲とブレンドされる)範囲が大きくなり、閾値を大きく取るとぼかす対象が増えます。このあたりは目的に応じて使い分ける事になりますが、元々PNG向けの画像がJPEGで保存されていた場合のモスキートノイズを取り除く目的であれば、半径2.0、閾値32ぐらいの決めうちでいい具合でした。

これがデジカメの露光ノイズをとるとかの場合はもう少し試行錯誤が必要なようです。iPhoneで撮った夜景の事例もminus.comにおいたのでご参考に。

ところでこの機能、なかなかCPU負荷が高いだけあって、どちらかというとWebには現状ホラーストーリーの方が多く見受けられます。

曰く、「写真一枚に数分かかった」。曰く「一時間たっても終わらない」。たしかにこの機能が登場した当時はそうだったのかも知れませんが、昨今のCore iとかだとあっという魔、数秒といったところです。(およそ同じ大きさの画像であれば、ぼかし半径が大きいほど時間がかかるようです。比例定数は半径の二乗でいいのかな?)こういうカジュアルが応用例が見つからなかったのもそのためかも知れません。

よほど古いCPUをお使いでない方は、ぜひおためしを。

Dan the Lossy Blogger

追記: アルゴリズム名は Bilateral Filter でいいのかな。Photoshopでは"Surface Blur"がこれに相当するそうです。

Bilateral filter - Wikipedia, the free encyclopedia
A bilateral filter is an edge-preserving and noise reducing smoothing filter. The intensity value at each pixel in an image is replaced by a weighted average of intensity values from nearby pixels. This weight is based on a Gaussian distribution. Crucially the weights depend not only on Euclidean distance but also on the radiometric differences (differences in the range, e.g. color intensity or Z distance). This preserves sharp edges by systematically looping through each pixel and according weights to the adjacent pixels accordingly

この記事へのトラックバックURL