在計算機視覺領域,圖像縮放和裁剪是最基礎也最常用的操作。無論是調整圖像大小以適應模型輸入,還是裁剪掉無關區域突出主體,這些技巧都能幫你解決實際問題。本文將用最簡單的方式帶你掌握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
- 居中裁剪需先計算中心偏移量,確保區域完整
通過以上兩個核心操作,你已經可以處理大多數簡單的圖像預處理需求了。實際應用中,這兩個技巧經常結合使用(比如先裁剪再縮放),快去動手試試吧!遇到問題時,記得檢查圖像路徑、座標範圍和窗口操作,這些都是初學者最容易出錯的地方~