我有一个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转换为float允许使用原始范围外的值。cv2.resize()函数不能使用默认的'int64'类型。但是,转换为'uint8'将自动使值饱和到[0..255]。
另外,正如SaulloCastro指出的那样,另一个相关的答案展示了scipy的插值方法,并且默认方法是立方插值(带饱和度)。