2014-05-25 56 views
4

我有一個numpy數組,我希望使用opencv調整大小。 其值範圍從0到255.如果我選擇使用cv2.INTER_CUBIC,我可能會得到超出此範圍的值。這是不可取的,因爲調整大小的數組應該仍然表示圖像。 一個解決方案是將結果剪裁爲[0,255]。另一種是使用不同的插值方法。 我的理解是,使用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)允許原始範圍之外的值。 cv2.resize()函數不適用於默認的「int64」類型。但是,轉換爲'uint8'會自動將值飽和到[0..255]。另外,正如SaulloCastro指出的,另一個相關的答案顯示了scipy的插值,並且其中defualt方法是三次插值(具有飽和度)。

+0

爲什麼a.astype('float')?沒有它,它正常飽和 – berak

+0

你是對的,它的確如此。 但是,我擔心我可能會誤用立方插值方法,因爲我遇到了負值。 另請注意,輸入數組「a」僅爲3x3,對於INTER_CUBIC的4x4補丁來說太小。但是這種現象在較大的圖像中也會出現。 –

+0

您的上下文中的「最佳」是什麼意思?既然你沒有任何信息,但是新子像素代表的塊的意思是,你似乎有一個模型,他們應該是什麼樣子。 – Bort

回答

1

我認爲你應該從INTER_LINEAR開始,它是resize()函數的默認選項。它將足夠好的視覺效果與足夠好的時間表現結合起來(儘管它不如INTER_NEAREST那麼快)。它不會創建那些超出範圍的值。