私は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次補間(飽和あり)であることを示しています。
拡大画像の場合、INTER_LINEARまたはINTER_CUBIC補間。 縮小画像の場合、INTER_AREA補間を使用することをお勧めします。
キュービック補間は計算が複雑であるため、線形補間よりも低速です。ただし、結果の画像の品質は高くなります。
Resize()関数のデフォルトオプションであるINTER_LINEARから始めるべきだと思います。十分に優れた視覚結果と十分に優れた時間パフォーマンスを組み合わせます(ただし、INTER_NEARESTほど高速ではありません)。また、範囲外の値は作成されません。