在计算机视觉领域,图像缩放和裁剪是最基础也最常用的操作。无论是调整图像大小以适应模型输入,还是裁剪掉无关区域突出主体,这些技巧都能帮你解决实际问题。本文将用最简单的方式带你掌握Python OpenCV中这两个核心操作,即使是零基础也能轻松跟上。
一、图像缩放:调整图像大小的技巧¶
图像缩放就像给照片”拉伸”或”压缩”,可以通过固定比例缩小/放大,也可以直接指定目标尺寸。OpenCV中使用cv2.resize()函数实现,这是你必须掌握的第一个工具。
1. cv2.resize()函数参数详解¶
这个函数的核心参数包括:
- 输入图像:要处理的图像(比如img)
- 目标大小:可以用两种方式指定
- 方法1:(宽度, 高度),直接给目标尺寸(如(200, 300))
- 方法2:(0, 0) + fx/fy(fx是水平缩放比例,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表示不直接指定尺寸,通过fx和fy自动计算。
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()
关键点:用//(整数除法)避免非整数坐标,确保裁剪区域完整。
三、总结:初学者必记的核心技巧¶
-
图像缩放
- 用cv2.resize(),按比例缩放用fx/fy,固定尺寸用(宽度, 高度)
- 缩小选INTER_AREA,放大选INTER_LINEAR,避免变形
- 注意路径正确性和窗口销毁(destroyAllWindows()) -
图像裁剪
- 本质是数组切片:img[y_start:y_end, x_start:x_end]
- 坐标从左上角开始,越界会报错,需确保y_end < h且x_end < w
- 居中裁剪需先计算中心偏移量,确保区域完整
通过以上两个核心操作,你已经可以处理大多数简单的图像预处理需求了。实际应用中,这两个技巧经常结合使用(比如先裁剪再缩放),快去动手试试吧!遇到问题时,记得检查图像路径、坐标范围和窗口操作,这些都是初学者最容易出错的地方~