为什么在指定 Dsize 与 fx/fy 时 OpenCV Resize 会给出不同的像素值?
Why Does OpenCV Resize Give Different Pixel Values When Specifying Dsize vs. fx/fy?
今天我惊讶地发现,当使用 OpenCV-Python 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
cv::resize
是一种仿射变换,将目标图像中的整数索引映射到源图像中的浮点索引,并使用插值方法计算值。因为是仿射变换,所以尺度参数是决定准确输出值的最重要的参数。
根据OpenCV source code for cv::resize(),如果提供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。
今天我惊讶地发现,当使用 OpenCV-Python 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
cv::resize
是一种仿射变换,将目标图像中的整数索引映射到源图像中的浮点索引,并使用插值方法计算值。因为是仿射变换,所以尺度参数是决定准确输出值的最重要的参数。
根据OpenCV source code for cv::resize(),如果提供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。