一、 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——图像缩放