はじめに
バイキュービック補間による画像拡大や縮小で直面しがちな問題の典型例について解説します。
予備知識: 光学的なズームイン/ズームアウトとバイキュービック補間による拡大/縮小の相違
光学的なズームは(本来は)被写体とカメラの間隔の調節です。
以下は、ストライプパターンを被写体として、1mと6mの距離で撮影した場合の見え方を模式的に示したものです。
| 被写体 |
|---|
![]() |
| 被写体 との距離 |
点拡がり関数 | 見え方 | |
|---|---|---|---|
| 1m | ![]() |
![]()
|
|
| 6m | ![]() |
![]()
|
|
| 縮尺を被写体に 合わせた場合 |
![]() |
![]()
|
- ズームアウトする(被写体から離れる)と小さく見えますが、レンズの解像度や点拡がり関数は一定なので、被写体に対する相対的なぼけ量が大きくなります。したがい、グラフの横方向の縮尺を被写体の見かけ上のサイズに合わせるとなまった形になります。
- ズームインする(被写体に近づく)場合はこの逆で、被写体に対する相対的なぼけ量は小さくなり、グラフは急峻な形になります。
※レンズの解像度: どの程度の細かさを表現できるかを表す性能指標。
単位は ラインペア/mm または 本/mm。
※点拡がり関数(PSF: Point Spread Function): 点光源に対する応答を表す関数。
一方で、バイキュービック補間では入力画像はそのままで、再サンプリングの間隔を調節することにより画像を拡大したり縮小したりします。
画像拡大や縮小への期待は、光学的なズームインやズームアウトの再現であり、相対的なぼけ量が期待と異なることで違和感が生じます。
問題例① 細かなパターンを縮小するとむらが発生
| 入力画像 | 1/8縮小画像 |
|---|---|
![]() |
![]() |
原因
バイキュービック補間による縮小では、被写体に対する相対的なぼけ量はそのままで、細かなパターンを粗い間隔で再サンプリングするので、むらが発生しやすいです。
一方で光学的なズームアウトでは相対的なぼけ量が大きくなるので、細かなパターンは適宜ぼけてつぶれ、それをサンプリングするのでむらが発生しにくいです。
対処方法
入力画像をぼかすことにより、被写体に対する相対的なぼけ量を大きくします。次にバイキュービック補間で縮小します。
以下は、OpenCVのcv::GaussianBlur(ksizeは21x21)で入力画像をぼかしてからバイキュービック補間で縮小した例です。
| ぼかした画像 | 1/8縮小画像 |
|---|---|
![]() |
![]() |
あるいは(OpenCVのcv::resizeで簡単に済ませるなら)INTER_CUBICではなくINTER_AREAを使用します。INTER_AREAは公式ドキュメントには「resampling using pixel area relation」とありますが、これは再サンプリング対象範囲の画素の値の合計を面積で割る、つまり平均値です。平均値圧縮はボックスフィルタと等価なので、画像をぼかす作用があります。ただし、ガウシアンでぼかす場合に比較し画質は若干悪くなります。
以下は、INTER_AREAで縮小した例です。
| 1/8縮小画像 (INTER_AREA) |
|---|
![]() |
問題例② 拡大した画像がぼける
原因
光学的なズームインでは、被写体に対する相対的なぼけ量が小さくなりますが、バイキュービック補間による拡大では、再サンプリングの間隔を小さくするだけなので、ぼけ量が大きくなったように見えてしまいます。
対処方法
バイキュービック補間で拡大後の画像に、先鋭化を適用すれば多少は改善します。しかし冒頭の6mの入力画像のようにつぶれてしまったものは復元出来ないため、状況により学習型超解像(GAN: 敵対的生成ネットワークなど)の適用を検討することになるかもしれません。
以下の例は、標準テスト画像「Cameraman」(出典:MIT Works Acquired Digitally)に、先鋭化としてアンシャープマスクを適用した例です。パラメータをいろいろ調節してみましたが、この例の程度の画質に対する効果は限定的なようです。
| 8倍拡大画像 | アンシャープマスク を適用 |
|---|---|
![]() |
![]() |
問題例③ CGイラストを拡大すると斜めエッジがぎざぎざになる
アニメ絵のようなCGイラストをバイキュービック補間で拡大すると、斜めエッジがぎざぎざになります。
以下は45度二値画像をバイキュービック補間で拡大した例です。(拡大後に x:160, y:160, w:180, h:180 の範囲を切り出し)
| 入力画像 | 8倍拡大画像 |
|---|---|
![]() |
![]() |
原因
CGイラストはカメラを通していない画像なのでぼけがありません。したがい、入力関数が2レベルしかないステップ状になります。このような関数は2次微分までのテイラー級数展開で表現することが困難です。($f(x)=f(x_j)+shf’(x_j)+s^2h^2f’’(x_j)/2+O(h^3)$ の内、剰余項$O(h^3)$が支配的になる)
直感的な把握としては、エッジの画素それぞれが点光源のように作用し、畳み込みカーネルの1/4が並んだような補間結果になります。以下は、バイキュービック補間の畳み込みカーネルと、45度二値画像のバイキュービック補間の、同じアングルの3Dプロットです。
| 畳み込みカーネル | 45度二値画像のバイキュービック補間 |
|---|---|
![]() |
![]() |
対処方法
入力画像を少しぼかしてからバイキュービック補間で拡大すれば、斜めエッジのぎざぎざが低減されます。
以下は、OpenCVのcv::GaussianBlur(ksizeは5x5)で少しぼかしてからバイキュービック補間で拡大した例です。
| 少しぼかした画像 | 8倍拡大画像 |
|---|---|
![]() |
![]() |
画像のぼけが許容できない場合は、学習型超解像を検討する必要があります。CGイラストは画像の詳細構造がシンプルなので、学習型超解像が適していると期待されます。
以下はアニメ絵(出典: Wikipe-tan, drawn by Kasuga~jawiki)をバイキュービック補間と学習型超解像(Real-ESRGAN)で4倍拡大した画像の比較です。元はsvgで、128px png化したものを入力画像とし、拡大後に x:120, y:80, w:160, h:200 の範囲を切り出しました。
Real-ESRGANのモデルはアニメ絵を大量に学習させたというrealesrgan-x4plus-animeです。拡大画像は、元のsvgから4倍サイズでpng化した画像と良く一致しています。
| 入力画像 (svgから 128px png化) |
バイキュービック 補間で拡大 |
学習型超解像 (Real-ESRGAN) で拡大 |
比較参照用 (svgから 512px png化) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
参考文献
-
Wenru Dong
What is OpenCV’s INTER_AREA Actually Doing?
https://medium.com/@wenrudong/what-is-opencvs-inter-area-actually-doing-282a626a09b3 -
Xintao Wang, Liangbin Xie, Chao Dong, Ying Shan
Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data
https://doi.org/10.48550/arXiv.2107.10833
関連記事

























