設原圖像高度為 \(f_H\),寬度為 \(f_W\)。
1. 水平鏡像變換
設原始圖像的任意點 \(P_0(x_0, y_0)\),沿水平(\(x\) 方向)鏡像后到新的位置 \(P(x,y)\),水平鏡像不改變 \(y\) 坐標。其變換式為
\[\left\{ \begin{array}{**lr**} x = f_W - x_0 \\ y = y_0 \end{array} \right. \]
矩陣表達式為:
\[\left[\begin{array}{**lr**} x\\ y \\ 1 \end{array}\right] =\left[\begin{array}{**lr**} -1 & 0 & f_W\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{array}\right] \left[\begin{array}{**lr**} x_0\\ y_0 \\ 1 \end{array}\right] \]
2. 垂直鏡像變換
設原始圖像的任意點 \(P_0(x_0, y_0)\),沿垂直(\(y\) 方向)鏡像后到新的位置 \(P(x,y)\),垂直鏡像不改變 \(x\) 坐標。其變換式為
\[\left\{ \begin{array}{**lr**} x = x_0 \\ y = f_H - y_0 \end{array} \right. \]
矩陣表達式為:
\[\left[\begin{array}{**lr**} x\\ y \\ 1 \end{array}\right] =\left[\begin{array}{**lr**} 1 & 0 & 0\\ 0 & -1 & f_H\\ 0 & 0 & 1 \end{array}\right] \left[\begin{array}{**lr**} x_0\\ y_0 \\ 1 \end{array}\right] \]
3. 對角鏡像變換
設原始圖像的任意點 \(P_0(x_0, y_0)\),沿對角鏡像后到新的位置 \(P(x,y)\)。其變換式為
\[\left\{ \begin{array}{**lr**} x = f_W - x_0 \\ y = f_H - y_0 \end{array} \right. \]
矩陣表達式為:
\[\left[\begin{array}{**lr**} x\\ y \\ 1 \end{array}\right] =\left[\begin{array}{**lr**} -1 & 0 & f_W\\ 0 & -1 & f_H\\ 0 & 0 & 1 \end{array}\right] \left[\begin{array}{**lr**} x_0\\ y_0 \\ 1 \end{array}\right] \]
4. 實戰
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('pic/rabbit500x333.jpg')
# 鏡像1
mirrorM = np.array([
[-1, 0, 333],
[0, 1, 0]
], dtype=np.float32)
img_mirr = cv.warpAffine(img, mirrorM, dsize=img.shape[:2][::-1])
show(img_mirr)
# 鏡像2
img_mirh = cv.flip(img, 1)
img_mirv = cv.flip(img, 0)
img_mirb = cv.flip(img, -1)
show(np.hstack([img, img_mirh, img_mirv, img_mirb]))
5. 效果
說明:
- 未經許可,謝絕轉載。
- 本教程為《數字圖像處理Python OpenCV實戰》的配套代碼相關內容。
免費視頻教程為0-6章(標題號≤6),可在此處點擊觀看。
所有課件及源代碼可在此處下載:
鏈接:https://pan.baidu.com/s/198PySe_vebO3e06idHSQ6g
提取碼:11o4
有問題可在QQ群(1079300899)指出,進群答案:數字圖像處理。
