在计算机视觉领域,图像缩放和裁剪是最基础也最常用的操作。无论是调整图像大小以适应模型输入,还是裁剪掉无关区域突出主体,这些技巧都能帮你解决实际问题。本文将用最简单的方式带你掌握Python OpenCV中这两个核心操作,即使是零基础也能轻松跟上。

一、图像缩放:调整图像大小的技巧

图像缩放就像给照片”拉伸”或”压缩”,可以通过固定比例缩小/放大,也可以直接指定目标尺寸。OpenCV中使用cv2.resize()函数实现,这是你必须掌握的第一个工具。

1. cv2.resize()函数参数详解

这个函数的核心参数包括:
- 输入图像:要处理的图像(比如img
- 目标大小:可以用两种方式指定
- 方法1:(宽度, 高度),直接给目标尺寸(如(200, 300)
- 方法2:(0, 0) + fx/fyfx是水平缩放比例,fy是垂直缩放比例,如fx=0.5表示缩小到原图一半)
- 插值方法:控制”如何计算新像素的值”,常用的有:
- cv2.INTER_AREA:适合缩小图像(效果更清晰)
- cv2.INTER_LINEAR:适合放大图像(默认选项,平滑效果好)

2. 示例1:按比例缩放(最常用)

假设你有一张1000×600的图像,需要缩小到原来的1/2,或放大到1.5倍,代码如下:

import cv2

# 1. 读取图像(路径请替换为你的图像路径)
img = cv2.imread("test.jpg")  # 彩色图像
if img is None:  # 检查图像是否读取成功
    print("图像路径错误!请确保文件存在。")
else:
    # 2. 按比例缩放:fx=0.5(宽度缩小一半),fy=0.5(高度缩小一半)
    scaled_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)

    # 3. 显示原图和缩放后的图像
    cv2.imshow("Original", img)   # 显示原图
    cv2.imshow("Scaled", scaled_img)  # 显示缩放图
    cv2.waitKey(0)  # 按任意键关闭窗口
    cv2.destroyAllWindows()  # 销毁所有窗口

关键点None表示不直接指定尺寸,通过fxfy自动计算。

3. 示例2:指定目标尺寸(固定宽高)

如果需要精确控制输出尺寸(比如把图像调整为200×200像素),直接传入目标宽高:

# 目标尺寸:宽度200,高度200
target_size = (200, 200)
resized_img = cv2.resize(img, target_size, interpolation=cv2.INTER_LINEAR)

# 显示结果
cv2.imshow("Target Size", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:如果目标尺寸与原比例不符,图像会被拉伸变形。若需保持比例,建议用按比例缩放。

4. 缩放的常见问题

  • 图像路径错误:用绝对路径(如"C:/Users/xxx/Desktop/test.jpg")更保险
  • 插值方法选错:缩小用INTER_AREA,放大用INTER_LINEAR,避免模糊
  • 窗口一闪而过:记得加cv2.waitKey(0)暂停显示,cv2.destroyAllWindows()关闭窗口

二、图像裁剪:精准截取图像区域

裁剪就像用剪刀”剪掉”图像的一部分,只保留感兴趣的区域。在OpenCV中,图像本质是NumPy数组,因此裁剪本质是数组切片操作。

1. 裁剪原理:数组切片

图像在OpenCV中以NumPy数组形式存储,格式为(高度, 宽度, 通道数)(如(600, 1000, 3))。要裁剪区域,只需指定左上角坐标右下角坐标,格式为:
img[y_start:y_end, x_start:x_end]

  • y_start:裁剪区域的起始行(垂直方向)
  • y_end:裁剪区域的结束行(垂直方向)
  • x_start:裁剪区域的起始列(水平方向)
  • x_end:裁剪区域的结束列(水平方向)

2. 示例1:裁剪固定区域

假设你需要裁剪图像中间的一块区域(比如从左上角(100, 50)到右下角(400, 300)):

# 读取图像
img = cv2.imread("test.jpg")

# 定义裁剪区域:y从100到500,x从50到400(注意顺序:先y后x)
cropped_img = img[100:500, 50:400]  # 切片格式:[y_start:y_end, x_start:x_end]

# 显示结果
cv2.imshow("Cropped", cropped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键点:坐标越界会导致错误!比如y_end不能超过图像高度(img.shape[0]),x_end不能超过宽度(img.shape[1])。

3. 示例2:裁剪中心区域(居中裁剪)

如果需要裁剪图像中心部分(比如把任意尺寸图像裁剪为固定尺寸200×200),可以先计算中心坐标:

# 读取图像
img = cv2.imread("test.jpg")
h, w = img.shape[:2]  # 获取原图高度h和宽度w

# 目标裁剪尺寸:200×200
target_h, target_w = 200, 200

# 计算中心坐标
x_start = (w - target_w) // 2  # 水平居中
y_start = (h - target_h) // 2  # 垂直居中
x_end = x_start + target_w
y_end = y_start + target_h

# 裁剪中心区域
cropped_center = img[y_start:y_end, x_start:x_end]

# 显示结果
cv2.imshow("Center Cropped", cropped_center)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键点:用//(整数除法)避免非整数坐标,确保裁剪区域完整。

三、总结:初学者必记的核心技巧

  1. 图像缩放
    - 用cv2.resize(),按比例缩放用fx/fy,固定尺寸用(宽度, 高度)
    - 缩小选INTER_AREA,放大选INTER_LINEAR,避免变形
    - 注意路径正确性和窗口销毁(destroyAllWindows()

  2. 图像裁剪
    - 本质是数组切片:img[y_start:y_end, x_start:x_end]
    - 坐标从左上角开始,越界会报错,需确保y_end < hx_end < w
    - 居中裁剪需先计算中心偏移量,确保区域完整

通过以上两个核心操作,你已经可以处理大多数简单的图像预处理需求了。实际应用中,这两个技巧经常结合使用(比如先裁剪再缩放),快去动手试试吧!遇到问题时,记得检查图像路径、坐标范围和窗口操作,这些都是初学者最容易出错的地方~

小夜