opencv 圖像平移、縮放、旋轉、翻轉 圖像仿射變換


圖像幾何變換

圖像幾何變換從原理上看主要包括兩種:基於2x3矩陣的仿射變換(平移、縮放、旋轉、翻轉)、基於3x3矩陣的透視變換。

圖像平移

opencv實現圖像平移

實現圖像平移,我們需要定義下面這樣一個矩陣,tx和ty分別是x和y方向上平移的距離:
用於圖像平移的矩陣
圖像平移利用仿射變換函數 cv.warpAffine() 實現

實驗

# 圖像平移
import numpy as np
import cv2 as cv

img = cv.imread('paojie.jpg')

rows, cols = img.shape[:2]

# 定義平移矩陣,需要是numpy的float32類型
# x軸平移100,y軸平移50
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 用仿射變換實現平移,第三個參數為dst的大小
dst = cv.warpAffine(img, M, (cols, rows))

cv.imshow('shift', dst)
cv.waitKey(0)
cv.destroyAllWindows()

實驗結果

圖像平移結果

圖像縮放

opencv中的圖像縮放

縮放就是調整圖片的大小,使用cv.resize()函數實現圖像縮放。可以按照比例縮放,也可以按照指定的大小縮放。

實驗

# 圖像縮放
import numpy as np
import cv2 as cv

img = cv.imread('paojie.jpg')

# 按照指定的寬度、高度縮放圖片
res = cv.resize(img, (132, 150))
# 按照比例縮放,如x,y方向均放大一倍
# res2 = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)

cv.imshow('shrink', res)
# cv.imshow('zoom', res2)
cv.waitKey(0)
cv.destroyAllWindows()

實驗結果

圖像縮小結果

各種interpolation方式

參考:各種插值方法介紹

圖像旋轉

簡介

旋轉同平移一樣,也是用仿射變換實現的,因此也需要定義一個變換矩陣。OpenCV直接提供了 cv.getRotationMatrix2D()函數來生成這個矩陣,該函數有三個參數:
參數1:圖片的旋轉中心
參數2:旋轉角度(正:逆時針,負:順時針)
參數3:縮放比例,0.5表示縮小一半

實驗

# 圖像旋轉
import numpy as np
import cv2 as cv

img = cv.imread('paojie.jpg')
rows,cols = img.shape[:2]

# 逆時針45°旋轉圖片並縮小一半,第一個參數為旋轉中心
M = cv.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5)
# img:源圖像;M:旋轉仿射矩陣;(cols,rows):dst的大小
dst = cv.warpAffine(img, M, (cols, rows))

cv.imshow('rotation', dst)
cv.waitKey(0)
cv.destroyAllWindows()

實驗結果

圖像旋轉縮小結果

圖像翻轉

opencv中的圖像翻轉

dst = cv2.flip(img, 1)
其中,函數中的第二個參數大於0,表示圖像水平翻轉(沿y軸);第二個參數等於0,表示圖像垂直翻轉(沿x軸);第二個參數小於0,表示圖像既水平翻轉,又垂直翻轉。

實驗

# 圖像翻轉
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread('paojie.jpg')

# 水平翻轉
hor = cv.flip(img,1)
# 垂直翻轉
ver = cv.flip(img,0)
# 水平垂直翻轉
hor_ver = cv.flip(img,-1)

plt.figure(1)
plt.subplot(2,2,1)
plt.imshow(img)
plt.title('Original')
plt.xticks([]),plt.yticks([])

plt.subplot(2,2,2)
plt.imshow(hor)
plt.title('horizontal')
plt.xticks([]),plt.yticks([])

plt.subplot(2,2,3)
plt.imshow(ver)
plt.title('vertical')
plt.xticks([]),plt.yticks([])

plt.subplot(2,2,4)
plt.imshow(hor_ver)
plt.title('horizontal_and_vertical')
plt.xticks([]),plt.yticks([])

plt.show()

實驗結果

圖像各種翻轉結果
看完了整篇文章,不點個贊放松一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM