Opencv调整大小结果与我手动计算的结果不同

3
图像数组
[[2, 2, 2, 2],
[2, 3, 3, 3],  
[2, 4, 4, 4],              
[5, 5, 5, 5]]

h = 4,w = 4。使用cv2.resize(img,(h//2,w//2))函数,结果为:

[[2, 3],
[4, 5]]

当我手动计算时,减少系数为2

newImage(0,0) -> oldImage(2*0,2*0) = oldImage(0,0) = 2 
newImage(0,1) -> oldImage(2*0,2*1) = oldImage(0,2) = 2
newImage(1,0) -> oldImage(2*1,2*0) = oldImage(2,0) = 2
newImage(1,1) -> oldImage(2*1,2*1) = oldImage(2,2) = 4

我的手动计算结果应该是:
[[2, 2],
[2, 4]]

我觉得我的逻辑没错啊,为什么与opencv的计算结果会有差异呢

1个回答

3

当调整图像大小时,有几种插值方法。您可以通过cv2.resizeinterpolation参数选择它。 这种方法确定如何根据旧像素计算新像素的值。

行为类似于您手动实现的方法的是cv.INTER_NEAREST。对于每个目标像素,它将选择最接近它的源像素并简单地复制其值,结果就像您的“手动”调整大小一样:

img2 = cv2.resize(img, (h//2, w//2), interpolation=cv2.INTER_NEAREST)

其他插值方法如cv2.INTER_LINEARcv.INTER_CUBIC等执行更复杂的计算,可能考虑到目标像素邻域中几个源像素。

如果您没有指定interpolation参数(就像上面的代码一样),则默认方法是cv2.INTER_LINEAR(而不是cv2.INTER_NEAREST)。这解释了您的结果。您可以将interpolation参数设置为不同的值并进行实验。

请参阅cv2.resize文档: cv.resize以及插值方法列表: InterpolationFlags

有一些经验法则适用于不同情况下哪种插值方法表现最佳。请参见此处:Which kind of interpolation best for resizing image?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接