opencv 图像缩放,不同的插值方法差异性比较

一、 interpolation 参数

图像尺寸改变函数:[详见4]
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
scr:原图片;dsize:输出图像尺寸;fx:沿水平轴的比例因子;fy:沿垂直轴的比例因子;interpolation:插值方法,包括:

cv2. INTER_LINEAR,双线性插值,在 x x x y y y 方向根据临近的两个像素的位置进行线性插值;

cv2.INTER_NEAREST,最近邻域插值;

cv2. INTER_CUBIC,4x4像素邻域的双三次插值;

cv2. INTER_LANCZOS4,傅立叶变换有关的三角函数的方法:8*8像素邻域的Lanczos插值,;-

cv2. INTER_AREA, 像素关系重采样

Preferable interpolation methods are cv.INTER AREA for shrinking and cv.INTER CUBIC (slow) & cv.INTER LINEAR for zooming. By default, the interpolation method cv.INTER LINEAR is used for all resizing purposes.
较好的插值方法:
shrinking:cv.INTER AREA
zooming(放大缩小):cv.INTER(慢)和 cv.INTER LINEAR (resize 默认值)。

demo代码:

import cv2 
img = cv2.imread("scale.png")
img_h, img_w, img_m = img.shape 
scale_h = int(2 * img_h) #require int 
scale_w = int(2 * img_w)
img_l = cv2.resize(img, (scale_w, scale_h), interpolation=cv2.INTER_LINEAR)
#img_l = cv2.resize(img, None, 0.5, 0.5, interpolation=cv2.INTER_LINEAR) #OR
cv2.imwrite("INTER_LINEAR.jpg", img_l)

img_l = cv2.resize(img, (scale_w, scale_h), interpolation=cv2.INTER_NEAREST)
cv2.imwrite("INTER_NEAREST.jpg", img_l)

img_l = cv2.resize(img, (scale_w, scale_h), interpolation=cv2.INTER_CUBIC)
cv2.imwrite("INTER_CUBIC.jpg", img_l)

img_l = cv2.resize(img, (scale_w, scale_h), interpolation=cv2.INTER_LANCZOS4)
cv2.imwrite("INTER_LANCZOS4.jpg", img_l)

img_l = cv2.resize(img, (scale_w, scale_h), interpolation=cv2.INTER_AREA)
cv2.imwrite("INTER_AREA.jpg", img_l)

二、 cv2.INTER_AREA 方法详解

cv2.INTER_AREA 在缩小和放大图像时,是完全不一样的。参考详见知乎专栏 OpenCV里的INTER_AREA究竟是在做啥?

1. 缩小图像

这里我们指的是输出图像的宽和高都不大于输入图像的宽和高。
然后这里,我们又要开始区分不同的情况,即看缩小比例是不是整数倍(当然是在指scale_x和scale_y,因为输出图像小)。

1.1 缩小比例是整数倍
  • 调用的interpolation是INTER_LINEAR_EXACT 时,如果宽和高的缩小比例都是2,并且图像的通道数量不是2,那么实际会调用INTER_AREA。

  • 调用的 interpolation 是 INTER_LINEAR 时,如果宽和高的缩小比例都是2,那么实际会调用 INTER_AREA

  • INTER_AREA是 box filter (average filter)

1.2 缩小比例不是整数倍

当缩小比例不是整数倍的时候的情况。每一种颜色代表block在不断移动到下一个位置的情形。例如下图1维图像情况:

2. 放大图像

当用 INTER_AREA 来放大图像时,实际调用的是 INTER_LINEAR,只是线性插值的系数和正常算法不一样。

  • 放大比例是整数倍
    系数为(1,0)的线性插值(复制左侧/上方像素)。

  • 放大比例不是整数倍
    线性插值,大部分系数为(1,0)。

参考文献:
Comparison of resize interpolation methods in opencv
知乎 Aaron Dong 博主 OpenCV里的INTER_AREA究竟是在做啥?
opencv官方文档 Geometric Transformations of Images
CSDN GISer_Lin博主 opencv学习4——图像缩放

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值