在OpenCV中提供函数cv2.resize()实现对图像的缩放,该函数的具体形式如下:
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
参数解析:
dst:输出的目标图像,其类型与src相同,大小为 dsize(当该值非零时),或者可以通过 src.size()fxfy 计算得到。
src:需要进行缩放的原始图像。
dsize :输出图像的大小。
x: 水平方向的缩放比例。
y: 垂直方向的缩放比例。
interpolation :插值方式,具体形式如下表。

  插值是指图像在进行几何处理时,给无法直接通过映射得到的值的像素点赋值。比如:将原始图像放大为原来的2倍,必然会多出一些无法被直接映射值得像素点,对于这些像素点,插值方式决定了如何确定它们的值

   还有反向映射可能会把目标图像中的像素点值映射到原始图像中的非整数值对应的位置上,当然原始图像内是不可能存在这样的非整数位置的,即目标图像上的该像素点不能对应到原始图像的某个具体位置上,此时也要对这些像素点进行插值处理,以完成映射。

类型

说明

cv2.INTER_NEAREST

最临近插值

cv2.INTER_LINEAR

双线性插值(默认方式)

cv2.INTER_CUBIC

三次样条插值。首先对源图像附近的 4×4 近邻区域进行三次样条拟合,然后将目标像素对应的三次样条值作为目标图像对应像素点的值

cv2.INTER_AREA

区域插值,根据当前像素点周边区域的像素实现当前像素点的采样。该方法类似最临近插值方式

cv2.INTER_LANCZOS4

一种使用 8×8 近邻的 Lanczos 插值方法

cv2.INTER_LINEAR_EXACT

位精确双线性插值

cv2.INTER_MAX

差值编码掩码

cv2.WARP_FILL_OUTLIERS

标志,填补目标图像中的所有像素。如果它们中的一些对应源图像中的奇异点(离群值),则将它们设置为零

cv2.WARP_INVERSE_MAP

标志,逆变换。例如,极坐标变换: 如果 flag 未被设置,则进行转换:dst(∅, 𝜌) = src(𝑥, 𝑦);如果 flag 被设置,则进行转换:dst(x, y) = src(∅, ρ)

  当缩小图像时,使用区域插值方式(INTER_AREA)能够得到最好的效果;

  当放大图像时,使用三次样条插值INTER_CUBIC)方式和双线性插值INTER_LINEAR)方式都能够取得较好的效果。三次样条插值方式速度较慢,双线性插值方式速度相对较快且效果并不逊色。

  在 cv2.resize() 函数中,目标图像的大小可以通过“参数 dsize”或者“参数 fxfy”二者 之一来指定,具体如下:

①通过参数 dsize 指定
  如果指定了参数 dsize 的值,无论是否指定了参数 fxfy 的值,都由参数 dsize 来决定目标图像的大小。
  此时需要注意的是 dsize 内第 1 个参数对应缩放后图像的宽度(width,即列数 cols,与参数 fx 相关),第 2 个参数对应缩放后图像的高度(height,即行数 rows,与参数 fy 相关)。指定参数 dsize 的值时,x 方向的缩放大小(参数 fx)为:(double)dsize.width/src.colsy 方向的缩放大小(参数 fy)为:(double)dsize.height/src.rows

②通过参数fxfy指定
  如果参数 dsize 的值是 None,那么目标图像的大小通过参数 fxfy 来决定。此时,目标图像的大小为dsize=Size(round(fx*src.cols),round(fy*src.rows))    函数 cv2.size()可以实现对原始图像的缩放功能,需要注意的是在开始运算前,操作前的目标图像 dst 的大小、类型与最终得到的目标图像 dst 是没有任何关系的。目标图像 dst 的最终大小和类型是通过 srcdsizefxfy 指定的。如果想让原始图像调整为和目标图像一样大,则必须通过上述属性指定。

程序示例一

使用函数 cv2.resize()对图像进行一个简单的缩放。

import cv2
lena=cv2.imread("./lena.jpg")
height, width = lena.shape[:2]  # 获取图像的高度和宽度
size=(int(width*0.8),int(height*0.5))   #更改尺寸
rst=cv2.resize(lena,size)
print("lena.shape=",lena.shape)
print("rst.shape=",rst.shape)
cv2.imshow("原始图像", lena)
cv2.imshow("缩放图像", rst)
cv2.waitKey()
cv2.destroyAllWindows()

程序运行结果如下,可以看出列数变为原来的0.8倍,为512 × 0.8=409.6;行数变为原来的0.5倍,为512 × 0.5=256。

lena.shape= (512, 512, 3)
rst.shape= (256, 409, 3)

图片的resolution函数 图像resize原理_图像处理


图1  原始图像



图片的resolution函数 图像resize原理_图像处理_02


图2  缩放图像

程序示例二

控制函数 cv2.resize()fx参数、fy参数对图像进行一个简单的缩放。

import cv2
lena=cv2.imread("./lena.jpg")
rst=cv2.resize(lena,None,fx=2,fy=0.5)
print("lena.shape=",lena.shape)
print("rst.shape=",rst.shape)
cv2.imshow("原始图像", lena)
cv2.imshow("缩放图像", rst)
cv2.waitKey()
cv2.destroyAllWindows()

   从程序运行结果可以看出,fx进行的是水平方向上的缩放,将列数变为原来的2倍,得到512×2=1024;fy进行的是垂直方向上的缩放,将列数变为原来的0.5倍,得到512×0.5=256。

lena.shape= (512, 512, 3)
rst.shape= (256, 1024, 3)

图片的resolution函数 图像resize原理_图像处理_03


图3  原始图像


图片的resolution函数 图像resize原理_计算机视觉_04


图4  缩放图像