为什么opencv resize在指定dsize和fx/fy时会给出不同的像素值?

qcbq4gxm  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(398)

今天我惊讶地发现,在使用opencvpython时 cv2.resize 当我指定 fx 以及 fy 或者如果我做了 dsize 我自己计算并提供。请注意,这不是大小不匹配,而是实际像素值的差异。

import cv2
import numpy as np

scale = 0.55
image = np.arange(100).reshape(10, 10).astype(np.float)
resized_fx_fy = cv2.resize(image, None, fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR)
resize_height, resize_width = resized_fx_fy.shape
resized_dsize = cv2.resize(image, (resize_width, resize_height), interpolation=cv2.INTER_LINEAR)
print(np.abs(resized_fx_fy - resized_dsize).max())
7.499998092651367
print(resized_fx_fy - resized_dsize)
[[0.83333344 0.98484851 1.13636362 1.28787897 1.43939408 1.09090917]
 [2.34848631 2.50000024 2.65151525 2.80303049 2.9545455  2.6060605 ]
 [3.86363742 4.01515031 4.16666532 4.31818056 4.46969557 4.12121058]
 [5.37879091 5.53030276 5.68181777 5.83333302 5.98484802 5.63636303]
 [6.89394202 7.04545283 7.19696784 7.34848309 7.49999809 7.1515131 ]
 [3.40909298 3.5606029  3.71211791 3.86363316 4.01514816 3.66666317]]

从opencv文档的天真解释来看,它们应该是等价的,但显然不是。
一个可能的提示:上面的代码在 scale = 0.5 如果相关:

Python 3.8.5

opencv-contrib-python     4.2.0.34                 pypi_0    pypi
opencv-python             4.2.0.34                 pypi_0    pypi
opencv-python-headless    4.5.1.48                 pypi_0    pypi
mwkjh3gx

mwkjh3gx1#

cv::resize 是一种仿射变换,它将目标图像中的整数索引Map到源图像中的浮点索引,并使用插值方法计算值。由于是仿射变换,尺度参数是确定精确输出值的最重要参数。
根据cv::resize()的opencv源代码,如果 dsize 提供, fx 以及 fy (称为 inv_scale_x 以及 inv_scale_y 在c++源代码中)被输出到输入的相对比例覆盖,而不管 fx 或者 fy 是否为零。在你的例子中,第一个 cv.resize() 使用 inv_scale_x 以及 inv_scale_y 为0.55。第二个 cv.resize() 对这两个比例参数使用0.6。

相关问题