我对cv2.warpAffine
有疑问。我想使用cv2.INTER_AREA
插值。但是,当我将图像尺寸从3kx3k调整为100x100时,其作用与cv2.INTER_LINEAR
相同。
在文档中,有一个类似插值类型的标志,但是它不起作用=(
# create random image
image = np.random.randint(0, 255, (3000, 3500, 3)).astype(np.uint8)
pts1 = np.float32([[0,0],[3000, 3500],[0,3500]])
t_size = 100
pts2 = np.float32([[5,12],[t_size + 20,t_size + 10],[0,t_size-50]])
# calculate transformation matrix
M = cv2.getAffineTransform(pts1,pts2)
# warp with different flags
image_linear = cv2.warpAffine(image, M, (t_size, t_size), flags = cv2.INTER_LINEAR)
image_area = cv2.warpAffine(image, M, (t_size, t_size), flags = cv2.INTER_AREA)
assert((image_linear == image_area).all())
图像相等,断言中没有任何异常。
答案 0 :(得分:1)
我在opencv C ++代码中找到了答案。
warpAffine函数中有下一行代码
if( interpolation == INTER_AREA )
interpolation = INTER_LINEAR;
对于我来说,我将仿射变换拆分为旋转,平移和调整大小。并通过线性插值使用旋转和移位。并使用interpolation= cv2.INTER_AREA
插值调整大小。