web-dev-qa-db-ja.com

画像のサイズ変更に最適な補間の種類はどれですか?

私はopencvを使用してサイズを変更したい派手な配列を持っています。その値の範囲は0〜255です。cv2.INTER_CUBICを使用することを選択した場合、この範囲外の値を取得する可能性があります。サイズ変更された配列はまだ画像を表すはずなので、これは望ましくありません。 1つの解決策は、結果を[0、255]にクリップすることです。もう1つは、異なる補間方法を使用することです。 INTER_AREAの使用は画像のダウンサンプリングには有効ですが、アップサンプリングの最近傍と同様に機能し、私の目的に最適ではないレンダリングになることは私の理解です。

INTER_CUBIC(およびクリップ)、INTER_AREA、またはINTER_LINEARを使用する必要がありますか?

iNTER_CUBICを使用した範囲外の値の例:

a = np.array( [ 0, 10, 20, 0, 5, 2, 255, 0, 255 ] ).reshape( ( 3, 3 ) )
[[  0  10  20]
 [  0   5   2]
 [255   0 255]]

b = cv2.resize( a.astype('float'), ( 4, 4 ), interpolation = cv2.INTER_CUBIC )
[[   0.            5.42489886   15.43670964   21.29199219]
 [ -28.01513672   -2.46422291    1.62949324  -19.30908203]
 [  91.88964844   25.07939219   24.75106835   91.19140625]
 [ 273.30322266   68.20603609   68.13853455  273.15966797]]

編集:berakが指摘したように、型を(int64から)floatに変換すると、元の範囲外の値が許容されます。 cv2.resize()関数は、デフォルトの「int64」タイプでは機能しません。ただし、「uint8」に変換すると、値が自動的に[0..255]に飽和します。

また、SaulloCastroによって指摘されたように、別の関連する回答はscipyの補間を示し、デフォルトの方法は3次補間(飽和あり)であることを示しています。

15
Roee E

拡大画像の場合、INTER_LINEARまたはINTER_CUBIC補間。 縮小画像の場合、INTER_AREA補間を使用することをお勧めします。

キュービック補間は計算が複雑であるため、線形補間よりも低速です。ただし、結果の画像の品質は高くなります。

2
Shivam Kushwaha

Resize()関数のデフォルトオプションであるINTER_LINEARから始めるべきだと思います。十分に優れた視覚結果と十分に優れた時間パフォーマンスを組み合わせます(ただし、INTER_NEARESTほど高速ではありません)。また、範囲外の値は作成されません。

2