画像のピクセルのRGBの3つの要素を持つ3次元配列のそれぞれに補間アルゴリズムを用いて画像を補間します。 画像の再標本化っていうらしいです。車輪の再発明ですね。
PCHIP(区分的三次エルミート内挿多項式)による4倍拡張の結果を以下に示します。
自動的にある程度高品質化されてしまうようなので、Originには各ピクセルを4倍に拡大したものを用いています。
(vscode以外のviewerで見るとほとんど違いが分からないので、実際に高品質化できているかは不明です。)
Origin | |
---|---|
Result |
Origin | |
---|---|
Result |
pipなどで以下のライブラリをインストールしてください。
pip install numpy
pip install scipy
pip install opencv-python
requirements.txtを用いてインストールすることもできます。
pip install -r requirements.txt
実行は以下のコマンドで行えます。
python pchip.py 画像のPATH 補間倍率
拡大倍率が整数でない場合は、小数点以下を切り捨てた整数倍の拡大倍率に自動的に変換されます。
pchip_generated.pngという名前で補間後の画像が生成されます。
並列処理を行っていて、CPU使用率が100%になるので注意してください。
1スレッドで実行する場合は以下のコマンドで行えます。
python pchip_single.py 画像のPATH 補間倍率
なお、動作確認は以下の環境で行っています。
Python version: 3.11.3
NumPy version: 1.24.3
SciPy version: 1.10.1
OpenCV-Python version: 4.7.0.72
scipy.interpolate.PchipInterpolatorを用いて画像のピクセルを補間します。
- 高品質化される過程で、不自然なピクセル化が起こらずにきれいな結果になる
- あくまで補間であるので、とてもきれいになるというわけではない
- 小数倍率は適用できない
scipy.interpolate.pchip を用いて1次元のPCHIPを縦横に適応することで2次元化しています。
まず横に適応するために、各行を1次元配列とみなし、PCHIPを適応します。
次に縦に適応するために、各列を1次元配列とみなし、PCHIPを適応します。
これにより、2次元配列を補間することができます。
2倍拡大時を図にすると以下のようになります。
1を元々の画像のピクセル、2を横に適応した後の画像のピクセル、3を縦に適応した後の画像のピクセルとします。
指定された倍率だけピクセル間に挿入することで、画像の補間を実現しています。
上記の実装だと外挿時に不自然なピクセルが発生するので、元々の画像のピクセルを右、下に複製した状態で補間を行っています。
PCHIP以外でも実装を行いました。
Origin | |
---|---|
RectBivariateSpline | |
Akima | |
PCHIP |
scipy.interpolate.RectBivariateSplineを用いて画像のピクセルを補間します。
- 小数倍率も可能
- 関数を保存しておくことができ、その関数から画像を補間することができる
- scipyを用いることで実装が簡単
- 大幅に色が変わる部分で(おそらく)オーバーシュート、アンダーシュートが発生し不自然なピクセルが発生する
scipy.interpolate.Akima1DInterpolatorを用いて画像のピクセルを補間します。
- 2変量スプライン近似よりも不自然なピクセルが少ない
- 大幅に色が変わる部分で(おそらく)オーバーシュート、アンダーシュートが発生し不自然なピクセルが発生する