1. 程式人生 > >OpenCV-Python-(2)-幾何變換

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()