我需要帮助来确定 OpenCV 用于使用非线性缩放因子进行图像下采样的算法/实现。
我知道这个问题已经问过几次了,但大多数答案似乎与 OpenCV 的实现不匹配(例如,使用 OpenCV 时这个答案不正确:https ://math.stackexchange.com/questions/48903/2d-array -下采样和上采样使用双线性插值)。
最小问题表述:
我想使用双线性插值将分辨率为 4x4 的图像下采样为分辨率为 3x3 的图像。我对插值系数感兴趣。
python中的示例:
img = np.asarray([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]).astype(np.float32)
img_resized = cv2.resize(img, (3, 3), 0, 0, cv2.INTER_LINEAR).astype(np.float32)
print(img)
# [[ 1. 2. 3. 4.]
# [ 5. 6. 7. 8.]
# [ 9. 10. 11. 12.]
# [13. 14. 15. 16.]]
print(img_resized)
# [[ 1.8333333 3.1666667 4.5 ]
# [ 7.166667 8.5 9.833333 ]
# [12.5 13.833333 15.166666 ]]
插值系数:
经过大量的反复试验,我发现了 OpenCV 用于这种特定情况的插值系数。
对于 3x3 图像的角点:
1.8333333 = 25/36 * 1 + 5/36 * 2 + 5/36 * 5 + 1/36 * 6
4.5000000 = 25/36 * 4 + 5/36 * 3 + 5/36 * 8 + 1/36 * 7
12.5000000 = 25/36 * 13 + 5/36 * 9 + 5/36 * 14 + 1/36 * 10
15.1666666 = 25/36 * 16 + 5/36 * 15 + 5/36 * 12 + 1/36 * 11
对于 3x3 图像的中间点:
8.5 = 1/4 * 6 + 1/4 * 7 + 1/4 * 10 + 1/4 * 11
对于 3x3 图像的剩余 4 个点:
3.1666667 = 5/12 * 2 + 5/12 * 3 + 1/12 * 6 + 1/12 * 7
7.1666667 = 5/12 * 5 + 5/12 * 9 + 1/12 * 6 + 1/12 * 10
9.8333333 = 5/12 * 8 + 5/12 * 12 + 1/12 * 7 + 1/12 * 11
13.833333 = 5/12 * 14 + 5/12 * 15 + 1/12 * 10 + 1/12 * 11
问题:
有人可以帮我理解这些插值系数吗?它们是如何计算的?我试图阅读 cv::resize() 函数的源代码,但它对我没有多大帮助:S