OpenCV warpAffine的天坑

637 阅读1分钟
原文链接: zhuanlan.zhihu.com

问:

在OpenCV中,通过resize将(w1, h1)尺寸的图片转化为(w2, h2)尺寸的图片,和通过warpAffine配合

[公式]

矩阵变换进行仿射变换,插值模型都使用双线性(不考虑OpenCV LINEAR实现中特殊处理的几种情况),那么得到的结果是否相同呢?

答:

不相同,可以试试

[[255, 200,   0,  50],
 [200, 255,  50,   0],
 [  0,  50, 255, 200],
 [ 50,   0, 200, 255]]

这个4 * 4的小图片,将它缩小一半:

>>> d = numpy.array([[255, 200,   0,  50],
...  [200, 255,  50,   0],
...  [  0,  50, 255, 200],
...  [ 50,   0, 200, 255]], numpy.uint8)
>>> cv2.resize(d, (2,2))
array([[228,  25],
       [ 25, 228]], dtype=uint8)
>>> cv2.warpAffine(d, numpy.matrix([[0.5,0,0],[0,0.5,0]]), (2,2))
array([[255,   0],
       [  0, 255]], dtype=uint8)

显然resize的结果正确(进行了插值),而warp的结果不正确(只保留了奇数行列)。这是为什么呢?大家可以先思考下,过段时间再公布答案。