OpenCV-Python-(2)-幾何變換
影象變換:
- cv2.flip() # 影象翻轉
- cv2.resize() #影象尺寸變換
- cv2.warpAffine() #影象仿射
- cv2.getRotationMatrix2D() #取得旋轉角度的Matrix
- cv2.GetAffineTransform(src, dst, mapMatrix) #取得影象仿射的matrix
- cv2.getPerspectiveTransform(src, dst) #取得投影變換矩陣的4個點起止值
- cv2.warpPerspective() #影象投影變換
1.影象翻轉cv2.flip()
cv2.flip(src, flipCode[, dst]) → dst
flipMode: 翻轉模式。有三種模式:0 --- 垂直方向翻轉; 1----- 水平方向翻轉; -1:水平、垂直方向同時翻轉
import cv2 img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR) #水平翻轉 h_flip = cv2.flip(img, 1) #垂直翻轉 v_flip = cv2.flip(img, 0) #水平垂直翻轉 hv_flip = cv2.flip(img, -1) cv2.imshow("img", img) cv2.imshow("h_flip", h_flip) cv2.imshow("v_flip", v_flip) cv2.imshow("hv_flip", hv_flip) cv2.waitKey(0) cv2.destroyAllWindows()
2.影象尺寸變cv2.resize()
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
dsize - 目標影象大小。
interpolation - 插值方法:
1)INTER_NEAREST - 最近鄰插值法
2)INTER_LINEAR - 雙線性插值法(預設)
3)INTER_AREA - 基於區域性畫素的重取樣(resampling using pixel area relation)。對於影象抽取(image decimation)來說,這可能是一個更好的方法。但如果是放大影象時,它和最近鄰法的效果類似。
4)INTER_CUBIC - 基於4x4畫素鄰域的3次插值法
5)INTER_LANCZOS4 - 基於8x8畫素鄰域的Lanczos插值
import cv2
img = cv2.imread(r'C:\Users\x\Desktop\79.jpg', cv2.IMREAD_ANYCOLOR)
h, w = img.shape[:2]
h_new, w_new = h*0.25, w*0.25
h_new = int(round(h_new))
w_new = int(round(w_new))
new_img = cv2.resize(img, (h_new, w_new), interpolation=cv2.INTER_CUBIC)
cv2.imshow('img',img)
cv2.imshow('resize', new_img)
cv2.imwrite(r'C:\Users\x\Desktop\11.jpg', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.影象仿射變換
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
仿射變換函式:warpAffine(src, (2行3列的仿射變換矩陣A), (w, h)(輸出影象大小寬、高), 填充模式)
cv2.getRotationMatrix2D(center, angle, scale)
旋轉函式:getRotationMatrix2D(center(圖片的旋轉中心), angle(旋轉角度), scale(等比例縮放係數))
import cv2
import numpy as np
if __name__ == "__main__":
image = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
#原圖的高、寬
h, w = image.shape[:2]
#仿射變換矩陣,縮小兩倍,不進行平移
A1 = np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)
d1 = cv2.warpAffine(image, A1, (w,h), borderValue=125)
#先縮小兩倍再平移w/4和h/4個距離
A2 = np.array([[0.5, 0, w/4], [0, 0.5, h/4]], np.float32)
d2 = cv2.warpAffine(image, A2, (w,h), borderValue=125)
#在d2的基礎上,繞影象中心點旋轉30°,縮放0.5倍
A3 = cv2.getRotationMatrix2D((w/2.0, h/2.0), 30, 1) #getRotationMatrix2D(center, angle, scale(等比例縮放係數))
d3 = cv2.warpAffine(d2, A3, (w,h), borderValue=125)
cv2.imshow("image", image)
cv2.imshow("d1", d1)
cv2.imshow("d2", d2)
cv2.imshow("d3", d3)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.影象投影變換
cv2.getPerspectiveTransform(src, dst) → retval
cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
視角變換,需要一個3*3變換矩陣。在變換前後要保證直線還是直線。
構建此矩陣需要在輸入影象中找尋 4個點,以及在輸出影象中對應的位置。這四個點中的任意三個點不能共線。
#投影變換
import cv2
import numpy as np
#灰度影象轉化為ndarray型別
if __name__ == "__main__":
img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
h, w = img.shape[:2]
#原圖的四個點與投影變換對應的點
src = np.array([[0,0], [w-1,0], [0,h-1], [w-1,h-1]], np.float32)
dst = np.array([[50,50], [w/3.0,50], [50,h-1], [w-1,h-1]], np.float32)
#計算投影變換矩陣
p = cv2.getPerspectiveTransform(src, dst)
#計算投影變換
r = cv2.warpPerspective(img, p, (h,w), borderValue=125)
cv2.imshow("img", img)
cv2.imshow("r", r)
cv2.waitKey(0)
cv2.destroyAllWindows()