1-圖像處理基礎_嗶哩嗶哩_bilibili
輸出圖像像素點需要將圖象值要作類型轉換,轉成Int
圖像仿射變換
線性變換+平移
線性變換: 1,變換前直線,變換后仍然直線 2,直線比例不變 3,直線到遠點的距離不變
仿射變換計算:
常見變換:
? ? ? ? 恒等變換:變換前后一致
? ? ? ? 尺度變換:對尺寸作放大或縮小
? ? ? ? 旋轉變換:圖像旋轉但是尺寸不變
? ? ? ? 平移::位置移動尺寸不變
? ? ? ? 偏移(垂直、水平):垂直或者水平方向變化
代碼示例:
import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.jpg')# 原圖中的三個點
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
# 變換后的三個點
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 計算仿射變換矩陣
M = cv2.getAffineTransform(pts1, pts2)# 應用仿射變換
rows, cols, ch = img.shape
dst = cv2.warpAffine(img, M, (cols, rows))# 顯示結果
cv2.imshow('Input', img)
cv2.imshow('Affine Transform', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 原圖中的三個點
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
# 變換后的三個點
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 計算仿射變換矩陣
M = cv2.getAffineTransform(pts1, pts2)
OpenCV 會根據這三個點對(A→A',B→B',C→C')計算出一個仿射變換矩陣,它能把整張圖像從原始位置「平移、旋轉、縮放、剪切」到目標狀態。
仿射變換至少需要三個不共線的點
原因是:
仿射變換的核心是一個 2×3 的矩陣 M,它有 6 個自由度:
這個矩陣控制了圖像的:
-
縮放
-
旋轉
-
平移
-
剪切
3個點為什么足夠?
每個點對(原始點 -> 目標點)能提供兩個方程(x 和 y 方向),所以:
-
3個點 × 2 = 6 個方程
-
恰好解出 6 個未知數:a11,a12,a21,a22,tx,ty
?cv2.warpAffine
dst = cv2.warpAffine(src, M, dsize)
其中:
-
src
是輸入圖像 -
M
是 2×3 的仿射變換矩陣 -
dsize
是目標圖像的大小,格式為(width, height)
為什么是 (width, height)
?
這是因為 OpenCV 中:
-
圖像的
.shape
返回的是(rows, cols, channels)
,即(height, width, channels)
-
但在
cv2.warpAffine()
中,dsize
是圖像尺寸,而不是 shape,所以必須按照:dsize=(output_width,output_height)
?
圖像內容被映射到原始畫布之外
現象:
-
圖像內容扭曲到角落,部分區域成了黑色(像素值為0)
-
原因是變換后的位置超出了目標圖像尺寸
?