我有一个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,5,2,255,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指出的那样,将类型转换为float(来自int64)允许超出原始范围的值. cv2.resize()函数不能使用默认的’int64’类型.但是,转换为’uint8’会自动将值饱和为[0..255].
此外,正如SaulloCastro所指出的,另一个相关的答案证明了scipy的插值,并且defualt方法是三次插值(具有饱和度).
最佳答案