python - 哪种插值最适合调整图像大小?

标签 python opencv numpy interpolation

我有一个 numpy 数组,我希望使用 opencv 调整它的大小。 它的值范围从 0 到 255。如果我选​​择使用 cv2.INTER_CUBIC,我可能会得到这个范围之外的值。这是不可取的,因为调整大小的数组应该仍然表示图像。 一种解决方案是将结果裁剪到 [0, 255]。另一种是使用不同的插值方法。 据我了解,使用 INTER_AREA 对图像进行下采样是有效的,但在对图像进行上采样时,其工作方式与最近邻相似,因此渲染效果不符合我的目的。

我应该使用 INTER_CUBIC(和剪辑)、INTER_AREA 还是 INTER_LINEAR?

使用 INTER_CUBIC 的值超出范围的示例:

a = np.array( [ 0, 10, 20, 0, 5, 2, 255, 0, 255 ] ).reshape( ( 3, 3 ) )
[[  0  10  20]
 [  0   5   2]
 [255   0 255]]

b = cv2.resize( a.astype('float'), ( 4, 4 ), interpolation = cv2.INTER_CUBIC )
[[   0.            5.42489886   15.43670964   21.29199219]
 [ -28.01513672   -2.46422291    1.62949324  -19.30908203]
 [  91.88964844   25.07939219   24.75106835   91.19140625]
 [ 273.30322266   68.20603609   68.13853455  273.15966797]]

编辑:正如 berak 指出的那样,将类型转换为 float (从 int64)允许原始范围之外的值。 cv2.resize() 函数不适用于默认的“int64”类型。但是,转换为“uint8”会自动将值饱和到 [0..255]。

此外,正如 SaulloCastro 所指出的,另一个相关的答案演示了 scipy 的插值,并且默认方法是三次插值(具有饱和度)。

最佳答案

如果您正在放大图像,您应该更喜欢使用INTER_LINEARINTER_CUBIC 插值。 如果您要缩小图像,您应该更喜欢使用INTER_AREA插值。

三次插值在计算上更复杂,因此比线性插值慢。但是,生成的图像质量会更高。

关于python - 哪种插值最适合调整图像大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23853632/

相关文章:

python - 如何使用python将像素列表转换为图像

python - 将 numpy 索引应用于矩阵

python - 包含 4 个元素的数组 : need to compare max+min and the other 2 elements

python-3.x - 在 python 中更改多边形坐标的 long,lat 值

python - 为什么解构增强赋值不可能?

python - CPLEX 的 Python 中的 Bender 分解示例

java - 如果你想用 Java 开发,OpenCV vs ImageJ 选择哪一个?

python - pandas 数据框对象将与 sklearn kmeans 聚类一起使用吗?

python - Python 中 ND 数组的“删除”命令

c++ - 检测不完整/完美的三角形