OpenCV-Python学习(19)—— OpenCV 图像几何变换之图像缩放(cv.warpAffine、cv.resize)

1. 学习目标

  1. 学习图像的缩放矩阵;
  2. 学习 OpenCV 图像缩放函数 cv.resize 和 cv.warpAffine。

2. 图像的缩放矩阵

缩放是物体在 x 轴和 y 轴的缩放比例。

  1. fx 是图像在 x 轴的缩放比例,fy 是图像在 y 轴的缩放比例,公式:
    输入图片说明
    输入图片说明

3. 图像缩放函数

3.1 cv.warpAffine() 函数使用

cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

3.2 参数说明

参数 说明
src 表示输入图像。
M 表示变换矩阵,2行3列。
dsize 表示输出图像的大小,二元元组 (width, height)。
dst 表示变换操作的输出图像,可选项。
flags 表示插值方法,整型(int),可选项。
borderMode 表示边界像素方法,整型(int),可选项,默认值为 cv.BORDER_REFLECT。
borderValue 表示边界填充值,可选项,默认值为 0(黑色填充)。

3.3 flags 值说明

说明
cv.INTER_LINEAR 表示线性插值,默认选项。
cv.INTER_NEAREST 表示最近邻插值。
cv.INTER_AREA 表示区域插值。
cv.INTER_CUBIC 表示三次插值。
cv.INTER_LANCZOS4 表示 Lanczos 插值。

4. cv.resize() 实现图像的缩放和大小变化

4.1 cv.resize() 函数使用

cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

4.2 参数说明

参数 说明
src 表示输入图像。
dsize 表示输出图像的大小,二元元组 (width, height)。
dst 表示变换操作的输出图像,可选项。
fx 表示 x 轴上的缩放比例,实型,可选项。
fy 表示 y 轴上的缩放比例,实型,可选项。
interpolation 表示插值方法,整型,可选项。

4.3 interpolation 值说明

说明
cv.INTER_LINEAR 表示双线性插值(默认方法)。
cv.INTER_AREA 表示使用像素区域关系重采样,缩小图像时可以避免波纹出现。
cv.INTER_NEAREST 表示最近邻插值。
cv.INTER_CUBIC 表示 4x4 像素邻域的双三次插值。
cv.INTER_LANCZOS4 表示 8x8 像素邻域的Lanczos插值。

5. cv.warpAffine 图像缩放实例

5.1 实例代码

import cv2 as cv
import numpy as np

# 图像缩放
def image_zoom(src, zx=1, zy=1):
  h,w,c = src.shape
  M = np.float32([[1*zx,0,0],[0,1*zy,0]])
  img = cv.warpAffine(src,M,(int(w*zx),int(h*zy)))
  return img

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  img_zoom_half = image_zoom(img, 0.5,0.5)
  cv.imshow("zoom0.5", img_zoom_half)
  img_zoom_10 = image_zoom(img, 1.1,1.1)
  cv.imshow("zoom1.1", img_zoom_10)
  cv.waitKey(0)
  cv.destroyAllWindows()

5.2 效果

输入图片说明

6. cv.resize 图像缩放实例

6.1 实例代码

import cv2 as cv
import numpy as np

# 图像缩放
def image_resize(src):
  h,w,c = src.shape
  zoom_size = cv.resize(src,(int(w*0.5),int(h*0.5)))
  cv.imshow("zoom_size", zoom_size)
  zoom_scale = cv.resize(src,None,fx=0.5,fy=0.5)
  cv.imshow("zoom_scale", zoom_scale)

if __name__ == "__main__":
  img = cv.imread("./images/lena.jpg")
  cv.imshow("origin", img)
  image_resize(img)
  cv.waitKey(0)
  cv.destroyAllWindows()

6.2 效果

输入图片说明

7. 总结

  1. 变换缩放矩阵 M 是 np.float32 类型 ndarray 二维数组(2行*3列)
  2. 变换矩阵 M = np.float32([[1 * zx,0,0],[0,1 * zy,0]]),zx 表示 x 轴的缩放比例,zy 表示 y 轴的缩放比例。
  3. dsize 输出图像的大小格式为元组 (width, height)。
  4. 图像缩放可以通过 dsize 直接设定输出图像的大小,也可以通过 dx, dy 设置图像缩放的比例(dsize 设为 None)。

猜你喜欢

转载自blog.csdn.net/m0_38082783/article/details/128814379