画像のリサイズを行うときに陥りがちな罠


罠シリーズ2回目。(べつにシリーズ化はしないけどね。たまたま)

まず、リサイズについておさらい。

リサイズとは、その名のとおり画像データの拡大または縮小のこと。
アルゴリズムとしてはどうなっているかというと、
近傍画素の情報から、画素を「補間」するというもの。

は?
(いや、ぼくはわかってますよ(汗)

わかりやすく「拡大」で考えると、
拡大後の画像データは、拡大前の画像データより画素が増えるわけです。

この「増えた」画素は、本来、拡大前の画像データには存在しない画素。
存在しない画素を、どこかから補うのが「補間」。

ではどこから補うのかというと、近傍画素(周辺の画素)から補うのです。
近傍画素も1つだけ見るよりたくさん見たほうがより結果の精度は上がります。
その分、処理時間はかかります。トレードオフです。

今回は、16点の近傍画素から補間を行う「バイキュービック」を使ったリサイズで考えてみます。

では、まず以下の画像を2倍にリサイズしてみます。
(表示サイズは、リサイズ前と後とで同じにしています)

リサイズ後の方が、エッジがぼけて見えますが、それは問題ないです。
近傍画素から補間を行うということは、平均化しているのとほぼ変わらないので、補間された画素は近傍画素の平均値の画素になると思ってください。
むしろ、エッジが平均化されるので、ジャギ(極端な画素差)がなくなり、きれいに見えることを狙ったりするくらいです。

問題は、これからです。

いまリサイズした画像はアルファチャンネルを持つ32ビット画像です。
これを、アルファチャンネルを透過情報として、市松レイヤーに貼り付けてみます。
結果が以下です。

わかりずらいのでリサイズ後画像の表示をズームしてみます。

エッジになにやら青いスジが見えますよね。青色は、アルファチャンネルのマスク外の色でした。
これが罠です。

つまり、本来ならマスク内に現れるはずのない色なのに、リサイズ時に補間されたことで、マスク外の色がマスク内に侵食したのです。

なので、32ビット透過画像をリサイズするときは、
近傍画素を見るとき、その画素のアルファチャンネルを確認し、マスク外であるなら、その近傍画素はパスするという処理を入れてやる必要があります。
もしくは・・・、まあここではいいや。暇があったらまた書きます。

結果が以下です。

しかし、RGBチャンネルは

のようにリサイズ前画像から大きく変わってしまいます。
32ビット画像でも透過させる用途で使わないなら、上で述べたことは気にする必要はないです。

(具体的にバイキュービックのコードを例にどう修正すればいいかをのせようとおもったけど、
文が多くなっちゃったので割愛・・・)