圖像變換:掌握OpenCV中的幾何變換
學習目標
通過本課程,學員們將能夠理解圖像的幾何變換原理,包括縮放、旋轉和平移,并能夠使用Python和OpenCV庫實現這些變換。本課程將通過理論講解與實踐操作相結合的方式,幫助學員們掌握圖像處理的基礎技能。
相關知識點
- Python OpenCV圖像變換
學習內容
1 Python OpenCV圖像變換
1.1 圖像縮放
圖像縮放是圖像處理中最基本的操作之一,它涉及到改變圖像的大小。在OpenCV中,可以使用cv2.resize()
函數來實現圖像的縮放。縮放圖像時,可以指定新的圖像尺寸,也可以指定縮放比例。縮放比例可以是放大也可以是縮小,這取決于比例系數的大小。
1.1.1 理論知識
圖像縮放的基本原理是通過插值算法來估計新圖像中每個像素的值。插值算法的選擇會影響縮放后的圖像質量。常見的插值算法包括最近鄰插值、雙線性插值和雙三次插值。最近鄰插值算法簡單快速,但可能會導致圖像質量下降;雙線性插值和雙三次插值算法雖然計算復雜度較高,但能夠提供更好的圖像質量。
在OpenCV中,cv2.resize()
函數的參數包括源圖像、目標圖像的尺寸以及插值方法。插值方法可以通過指定interpolation
參數來選擇,例如cv2.INTER_NEAREST
(最近鄰插值)、cv2.INTER_LINEAR
(雙線性插值)、cv2.INTER_CUBIC
(雙三次插值)等。
1.1.2 實踐操作
執行以下指令獲取測試圖片。
wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/27ef5b722fa911f09b27fa163edcddae/example.jpg
下面是一個使用OpenCV進行圖像縮放的示例代碼:
import cv2
import matplotlib.pyplot as plt# 讀取圖像
image = cv2.imread('example.jpg')# 定義縮放比例
scale_percent = 50 # 縮小到50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)# 縮放圖像
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
# 顯示原始圖像和縮放后的圖像
# 將 BGR 格式轉換為 RGB 格式,以適配 matplotlib 的顯示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
resized = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
# 創建畫布和子圖(1行2列)
# 顯示第一張圖像
plt.subplot(1, 2, 1) # 1行2列,第1個位置
plt.imshow(image)
plt.title('Original Image')
# 顯示第二張圖像
plt.subplot(1, 2, 2) # 1行2列,第2個位置
plt.imshow(resized)
plt.title('Resized Image')
plt.tight_layout() # 自動調整布局
plt.show()
1.2 圖像旋轉
圖像旋轉是指將圖像繞著某個點(通常是圖像的中心點)旋轉一定的角度。在OpenCV中,可以使用cv2.getRotationMatrix2D()
函數來獲取旋轉矩陣,然后使用cv2.warpAffine()
函數來應用旋轉矩陣,實現圖像的旋轉。
1.2.1 理論知識
圖像旋轉的基本原理是通過旋轉矩陣來變換圖像中的每個像素。旋轉矩陣是一個2x3的矩陣,其中前兩列表示旋轉和平移,第三列表示平移。旋轉矩陣的計算公式為:
R=[cos?(θ)?sin?(θ)0sin?(θ)cos?(θ)0001]R = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix}R=?cos(θ)sin(θ)0??sin(θ)cos(θ)0?001??
其中,θ\thetaθ 是旋轉角度。為了確保旋轉后的圖像不會被裁剪,通常需要計算旋轉后的圖像尺寸,并在旋轉矩陣中加入平移部分。
1.2.2 實踐操作
下面是一個使用OpenCV進行圖像旋轉的示例代碼:
import cv2
import numpy as np# 讀取圖像
image = cv2.imread('example.jpg')# 獲取圖像的中心點
(h, w) = image.shape[:2]
center = (w // 2, h // 2)# 定義旋轉角度和縮放比例
angle = 45 # 旋轉45度
scale = 1.0 # 保持原大小# 獲取旋轉矩陣
M = cv2.getRotationMatrix2D(center, angle, scale)# 應用旋轉矩陣
rotated = cv2.warpAffine(image, M, (w, h))
# 顯示原始圖像和旋轉后的圖像
# 將 BGR 格式轉換為 RGB 格式,以適配 matplotlib 的顯示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rotated = cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB)
# 創建畫布和子圖(1行2列)
# 顯示第一張圖像
plt.subplot(1, 2, 1) # 1行2列,第1個位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 顯示第二張圖像
plt.subplot(1, 2, 2) # 1行2列,第2個位置
plt.imshow(rotated)
plt.title('Rotated Image')
plt.axis('off')
plt.tight_layout() # 自動調整布局
plt.show()
1.3 圖像平移
圖像平移是指將圖像中的所有像素沿水平和垂直方向移動一定的距離。在OpenCV中,可以使用cv2.warpAffine()
函數來實現圖像的平移。平移矩陣是一個2x3的矩陣,其中前兩列表示平移距離,第三列表示平移。
1.3.1 理論知識
圖像平移的基本原理是通過平移矩陣來變換圖像中的每個像素。平移矩陣的計算公式為:
T=[10tx01ty001] T = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} T=?100?010?tx?ty?1??
其中,txt_xtx? 和 tyt_yty? 分別是水平和垂直方向的平移距離。平移矩陣可以直接用于cv2.warpAffine()
函數,實現圖像的平移。
1.3.2 實踐操作
下面是一個使用OpenCV進行圖像平移的示例代碼:
import cv2
import numpy as np# 讀取圖像
image = cv2.imread('example.jpg')# 定義平移距離
tx = 100 # 水平方向平移100像素
ty = 50 # 垂直方向平移50像素# 構建平移矩陣
M = np.float32([[1, 0, tx], [0, 1, ty]])# 應用平移矩陣
translated = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 顯示原始圖像和平移后的圖像
# 將 BGR 格式轉換為 RGB 格式,以適配 matplotlib 的顯示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
translated = cv2.cvtColor(translated, cv2.COLOR_BGR2RGB)
# 創建畫布和子圖(1行2列)
# 顯示第一張圖像
plt.subplot(1, 2, 1) # 1行2列,第1個位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 顯示第二張圖像
plt.subplot(1, 2, 2) # 1行2列,第2個位置
plt.imshow(translated)
plt.title('Translated Image')
plt.axis('off')
plt.tight_layout() # 自動調整布局
plt.show()