1. 影像縮放
縮放是調整影像的大小,即放大或縮小,
cv2.resize(src, dsize, fx, fy, interpolation)
引數:
src 輸入影像
dsize 絕對尺寸,直接指定調整后影像的大小
fx,fy 相對尺寸,將dsize設定為None,然后將fx和fy設定為比例因子即可
interpolation 插值方法:
cv.INTER_LINEAR 雙線性插值
cv.INTER_NEAREST 最近鄰插值
cv.INTER_AREA 像素區域重采樣(默認)
cv.INTER_NEAREST 最近鄰插值
例1:使用絕對和相對尺寸的方法縮放圖片,
圖片尺寸374*500

import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
kids = cv.imread("./image/kids.jpg")
# 獲取size
rows, cols = kids.shape[:2]
print(rows, cols)
# 絕對尺寸
res = cv.resize(kids, (2 * cols, 2 * rows))
plt.imshow(res[:, :, ::-1])
plt.title("指定像素放大2倍")
plt.show()
print(res.shape)
# 相對尺寸
res1 = cv.resize(kids, None, fx=0.5, fy=0.5)
plt.imshow(res1[:, :, ::-1])
plt.title("指定像素放大2倍")
plt.show()
print(res1.shape)
輸出:
374 500
(748, 1000, 3)
(187, 250, 3)


2. 影像平移
將影像根據指定的方向和距離,移動到相應的位置,
cv.warpAffine(img, M, dsize)
引數:
img 輸入影像
M 2?*?3移動矩陣
dsize 輸出影像的大小
輸出影像的大小是(寬度, 高度)的形式,width=列數,height=行數,空余部分用黑色填充,
對于(x,y)處的像素點,要把它移動到
處時,M矩陣應如下設定:

注意:將M設定為np.float32型別的NumPy陣列,
例2:平移影像,
import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
kids = cv.imread("./image/kids.jpg")
# 獲取size
rows, cols = kids.shape[:2]
# 定義M矩陣
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 移動
res2 = cv.warpAffine(kids, M, (2 * cols, 2 * rows))
plt.imshow(res2[:, :, ::-1])
plt.title("移動")
plt.show()
輸出:

3. 影像旋轉
影像旋轉是指將影像按照一定的位置旋轉一定的角度的程序,影像在旋轉程序中仍然保持原來的大小,影像旋轉后,水平對稱軸、垂直對稱軸和影像中心坐標的原點可能會發生變換,因此影像旋轉中的坐標也需要進行相應的變換,

影像逆時針旋轉θ,則根據坐標轉換可得旋轉轉換為:

其中,

代入得:

或者寫成旋轉矩陣乘法的形式:

同時,必須修正原點的位置, 原圖坐標原點在影像左上角,旋轉后影像大小會發生變化,原點也需要修正,假設旋轉時坐標原點為旋轉中心,旋轉后需要將坐標原點移動到影像的左上角,

在OpenCV中,影像旋轉首先根據旋轉角度和旋轉中心得到旋轉矩陣,然后根據旋轉矩陣對影像進行變換,實作任意角度、任意中心的旋轉效果,

cv.getRotationMatrix2D(center, angle, scale)
引數:
center 旋轉中心 (col, row)
angle 旋轉角度
scale 縮放比例
回傳值:
旋轉矩陣M,
然后,呼叫cv.warpAffine()完成影像的旋轉,
例3:將上述影像逆時針旋轉45°,
import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
kids = cv.imread("./image/kids.jpg")
# 獲取size
rows, cols = kids.shape[:2]
# 獲取旋轉矩陣M 旋轉中心為影像中心,縮小為0.5倍
M = cv.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5)
print(M)
# 旋轉
res3 = cv.warpAffine(kids, M, (cols, rows))
plt.imshow(res3[:, :, ::-1])
plt.title("旋轉45°")
plt.show()
輸出:
[[ 0.35355339 0.35355339 95.49716831]
[ -0.35355339 0.35355339 209.27386361]]

4. 仿射變換
影像的仿射變換涉及影像的形狀、位置和角度的變化,仿射變換主要是影像的縮放、旋轉、翻轉和平移等操作的組合,
如下圖所示,Image 1中的1、2、3點一一映射到Image 2中的三個點上,依舊是一個三角形,只是形狀有了很大的變化,可以通過這兩組的三個點進行模擬,然后對影像中的所有點進行仿射變換,完成影像的仿射變換,

在OpenCV中,仿射變換的矩陣是一個2×3的矩陣:

其中左邊的2×2矩陣A是線性變換矩陣,右邊的2×1矩陣B是平移項:

對于影像上的任一位置(x,y),仿射變換執行的是如下的操作:

在仿射變換中,原圖中所有的平行線在結果影像中同樣平行,
cv.getA?neTransform(pts1, pts2)
引數:
從原影像中找到3個點以及他們在輸出影像中的位置,
輸出:
變換矩陣M,
然后,呼叫cv.warpAffine()完成影像的仿射變換,
例4:將上述影像進行仿射變換,
import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
kids = cv.imread("./image/kids.jpg")
# 獲取size
rows, cols = kids.shape[:2]
# 平移,使影像顯示完整
M = np.float32([[1, 0, 150], [0, 1, 150]])
# 移動
res4 = cv.warpAffine(kids, M, (cols * 2, rows * 2))
# 原影像中3個點
pts1 = np.float32([[200, 200], [500, 200], [500, 500]])
# 變換后的這3個點
pts2 = np.float32([[200, 200], [600, 200], [700, 500]])
# 獲得變換矩陣M
M = cv.getAffineTransform(pts1, pts2)
print(M)
res4 = cv.warpAffine(res4, M, (cols * 2, rows * 2))
plt.imshow(res4[:, :, ::-1])
plt.title("仿射變換")
plt.show()
輸出:
[[ 1.33333333 0.33333333 -133.33333333]
[ 0. 1. 0. ]]

5. 透射變換
透射變換是視角變化的結果,指利用透視中心、像點、目標點的三點共線條件,按透視旋轉定律使承載面(透視面)圍繞跡線(透視軸)按一定角度旋轉,破壞原有的投影光束,仍然保持承影面上投影幾何圖形不變的變換,

它的本質是將影像投影到一個新的視平面,其通用變換公式為:

其中,(u,v)是原始的影像像素坐標,w取值為1,(x=x'/z',y=y'/z')是透射變換后的結果,后面的矩陣稱為透視變換矩陣,一般情況下,我們將其分為三部分:

其中:T1表示對影像進行線性變換,T2對影像進行平移,T3表示對影像進行投射變換,a22??一般設為1,
cv.getPerspectiveTransform(pts1, pts2)
引數:
從原影像和變換后的影像找到對應的4個點,其中任意三個不共線,
回傳值:
變換矩陣T,
然后,呼叫cv.warpAffine()完成影像的透射變換,
例5:將上述影像進行透射變換,
import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
kids = cv.imread("./image/kids.jpg")
# 獲取size
rows, cols = kids.shape[:2]
pst1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pst2 = np.float32([[100, 145], [300, 100], [80, 290], [310, 300]])
# 變換矩陣T
T = cv.getPerspectiveTransform(pst1, pst2)
print(T)
res5 = cv.warpPerspective(kids, T, (cols, rows))
plt.imshow(res5[:, :, ::-1])
plt.title("透射變換")
plt.show()
輸出:
[[ 3.98327670e-01 -2.09876559e-02 7.49460064e+01]
[-1.92233080e-01 4.29335771e-01 1.21896057e+02]
[-7.18774228e-04 -1.33393850e-05 1.00000000e+00]]

6. 影像金字塔
影像金字塔是影像的一種多尺度表示,主要用于影像分割,它是一種有效但簡單的概念結構,可以解釋具有多種解析度的影像,
影像的金字塔是由相同的原始影像派生出來的、以金字塔形狀排列且解析度逐漸降低的影像的集合,它是通過逐步降采樣得到的,直到達到某個終止條件才停止采樣,金字塔的底部是要處理的影像的高解析度表示,頂部是低解析度的近似值,層級越高,影像越小,解析度越低,

cv.pyrUp(img) 對影像進行上采樣
cv.pyrDown(img) 對影像進行下采樣
例6:將上述影像進行上采樣和下采樣變換,
import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
kids = cv.imread("./image/kids.jpg")
# 獲取size
rows, cols = kids.shape[:2]
imgup = cv.pyrUp(kids)
plt.imshow(imgup[:, :, ::-1])
plt.title("上采樣變換")
plt.show()
imgdown = cv.pyrDown(kids)
plt.imshow(imgdown[:, :, ::-1])
plt.title("下采樣變換")
plt.show()
輸出:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294856.html
標籤:AI
