关于 OpenCV 调整 INTER_AREA 工作域大小的问题 (func != 0 && cn <= 4 in function 'cv::hal::resize' failure)

use*_*974 5 python opencv downsampling

resize我对使用插值时OpenCV 函数的工作范围有疑问INTER_AREA。以下是三种不同的插值:

import cv2
import numpy as np

cv2.resize(np.zeros((17, 99, 99), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# OK
cv2.resize(np.zeros((200, 64, 4), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# OK
cv2.resize(np.zeros((200, 64, 64), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# error: OpenCV(4.1.1) ..\modules\imgproc\src\resize.cpp:3557: error: (-215:Assertion failed) func != 0 && cn <= 4 in function 'cv::hal::resize'
Run Code Online (Sandbox Code Playgroud)

前两个工作正常,但最后一个失败。为什么会这样呢?什么样的输入/输出形状组合是可以接受的?

(请注意,该问题特定于INTER_AREA,因为其他插值方案似乎适用于所有三种情况)。

seb*_*sth 5

当旧图像宽度和高度不是新宽度和高度的整数倍时, OpenCVresize()INTER_AREA适用于最多 4 个通道的图像(宽度和高度的比例因子不必相同,只要两个比例都相同)因数为整数)。否则会产生错误。不幸的是,文档中似乎没有提到这一点,找出答案的唯一方法是深入研究源代码

您的第一个示例有效,因为仅在图像缩小时(在 x 和 y 方向上)才使用区域插值。否则使用双线性插值,并且它对通道没有这种限制。