目錄
縮放
平移
旋轉
翻轉:
我們經常會用到影像的縮放,旋轉以及平移,比如有的時候我們想對一類圖片進行操作,這個時候我們就需要對這一類的圖片進行尺寸統一,在以后深度學習的學習中,我們也會發現,對于資料集的訓練,它們的資料集樣本通常都是尺寸統一的,
縮放
縮放是調整圖片的大小,可以指定輸出影像尺寸大小,也可以指定縮放比例,
opencv函式cv2.resize()原型:

最后一個引數interpolation :差值方式使用默認即可 默認的是INTER_LINEAR

我們習慣的坐標表示 是 先 x 橫坐標,再 y 縱坐標,在影像處理中,這種慣性思維經常情況下是錯誤的,因為在計算機中,影像是以矩陣的形式保存的,先行后列,所以,一張 寬×高×顏色通道=480×256×3 的圖片會保存在一個 256×480×3 的三維張量中,影像處理時也是按照這種思想進行計算的(其中就包括 OpenCV 下的影像處理),即 高×寬×顏色通道,
但是問題來了,CV2.resize這個API卻是個小例外,因為它的引數輸入卻是 寬×高×顏色通道,
測驗代碼:
import cv2
img = cv2.imread('drawing.jpg')
# 按照指定的寬度、高度縮放圖片(影像可能變形)
res = cv2.resize(img, (132, 150))
# 按照比例縮放,如x,y軸均放大一倍
res2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
cv2.imshow('shrink', res), cv2.imshow('zoom', res2)
cv2.waitKey(0)
平移

引數含義:
- src: 輸入影像,
- M: 2×3 2行3列變換矩陣,
- dsize: 輸出影像的大小,
- dst: 可選,輸出影像,由dsize指定大小,type和src一樣,
- flags: 可選,插值方法
- borderMode: 可選,邊界像素模式
- borderValue: 可選,邊界填充值; 默認為0,
影像旋轉的原理:
我們根據公式:

可以得出:

所以對應的變換矩陣為:

測驗代碼:
import numpy as np
rows, cols = img.shape[:2]
# 定義平移矩陣,需要是numpy的float32型別
# x軸平移100,y軸平移50
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 用仿射變換實作平移,第三個引數為輸出的影像大小,值得注意的是該引數形式為(width, height),
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('shift', dst)
cv2.waitKey(0)
效果:

旋轉
- 引數1:旋轉中心點
- 引數2:旋轉角度(正:逆時針,負:順時針)
- 引數3:縮放比例,0.5表示縮小一半
代碼:
import cv2 as cv
img = cv.imread(r'Lena.png', 1)
rows, cols, channels = img.shape
rotate = cv.getRotationMatrix2D((rows*0.5, cols*0.5), 45, 0.5)
'''
第一個引數:旋轉中心點
第二個引數:旋轉角度
第三個引數:縮放比例
'''
res = cv.warpAffine(img, rotate, (cols, rows))
cv.imshow('img', img)
cv.imshow('res', res)
cv.waitKey(0)
cv.destroyAllWindows()
效果:

旋轉方式二:
可以利用矩陣操作cv2.transpose()來實作90旋轉,好處是不會出現仿射變換后圖片周圍的空缺區域,

transpose()旋轉實作
image_1_0 = cv2.transpose(image_1) # 矩陣的轉置也可以湊合實作90旋轉
旋轉方式三:
可以使用cv2.rotate()函式實作 90 180 270 度旋轉,也會避免第一種仿射變換后出現影像空缺區域的情況,引數選擇改第二個引數即可:
image_1_0 = cv2.rotate(image_1, cv2.ROTATE_90_CLOCKWISE)
翻轉:
dst = cv2.flip(img, 1)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297233.html
標籤:其他
上一篇:“人工智能基礎”課程筆記
