OpenCV-幾何變換-移動、旋轉、仿射變換


 

OpenCV 提供了兩個變換函數,cv2.warpAffine cv2.warpPerspective,使用這兩個函數你可以實現所有類型的變換。cv2.warpAffine 接收的參數是2 × 3 的變換矩陣,而 cv2.warpPerspective 接收的參數是 3 × 3 的變換矩陣。

 

  • 擴展縮放

  方法:resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

    dsize為縮放大小    

    fx,fy為影響因子

    interpolation為插值算法(在縮放時推薦使用 cv2.INTER_AREA,在擴展時推薦使用 cv2.INTER_CUBIC(慢) 和 cv2.INTER_LINEAR。默認情況下所有改變圖像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR

 1 import numpy as np  2 import cv2  3 
 4 img1 = cv2.imread("../image/min.jpg")  5 
 6 # 方式一
 7 img2 = cv2.resize(img1, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)  8 
 9 # 方式二
10 height, width = img1.shape[:2] 11 img3 = cv2.resize(img1, (2*width, 2*height), interpolation=cv2.INTER_LINEAR) 12 
13 
14 cv2.imshow("img", img1) 15 cv2.imshow("img2", img2) 16 cv2.imshow("img3", img3) 17 cv2.waitKey(0) 18 cv2.destroyAllWindows()

 

  • 平移

  若沿(x,y)方向平移(tx,ty),可以使用以下平移矩陣:

             

 1 import cv2  2 import numpy as np  3 
 4 img = cv2.imread('../image/min.jpg',0)  5 rows,cols = img.shape  6 
 7 M = np.float32([[1,0,100],[0,1,50]])  8 dst = cv2.warpAffine(img,M,(cols,rows))  9 
10 cv2.imshow('img',dst) 11 cv2.waitKey(0) 12 cv2.destroyAllWindows()

 

  • 仿射變換
import numpy as np
import cv2


def resize_img(img):
    # 擴大兩倍
    # 方法一
    # res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
    # 方法二
    # height, width = img.shape[:2]
    # res = cv2.resize(img, (2 * width, 2 * height), interpolation=cv2.INTER_CUBIC)


    # 圖像縮小
    # 方法二
    height, width = img.shape[:2]
    res = cv2.resize(img, (width // 2, height // 2), interpolation=cv2.INTER_AREA)
    res1 = cv2.resize(res, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

    cv2.imshow("normal", img)
    cv2.imshow("image", res1)


# 平移
def offset_img(img):
    print(img.shape)
    rows, cols = img.shape[:2]
    M = np.float32([[1, 0, 100], [0, 1, 50]])
    print(M)
    dst = cv2.warpAffine(img, M, (cols, rows))

    cv2.imshow("normal", img)
    cv2.imshow("image", dst)


# 旋轉
def rotation_img(img):
    rows, cols = img.shape[:2]

    # 生成旋轉矩陣(未縮放,以中心為原點)
    M = cv2.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), 90, 1)
    print(M)

    dst = cv2.warpAffine(img, M, (cols, rows))

    cv2.imshow("normal", img)
    cv2.imshow("image", dst)


# 仿射變換
def affine_img(img):
    rows, cols = img.shape[:2]

    # 原圖像中的三個點位
    pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
    # 變換后圖像對應的三個點位
    pts2 = np.float32([[10, 100], [200, 50], [100, 250]])

    # 生成變換矩陣
    M = cv2.getAffineTransform(pts1, pts2)
    print(M)

    # 對圖像進行仿射變換
    dst = cv2.warpAffine(img, M, (cols, rows))

    cv2.imshow("normal", img)
    cv2.imshow("image", dst)


if __name__ == "__main__":
    img = cv2.imread("../image/meixi.jpg")
    # print(img)
    # resize_img(img)
    # offset_img(img)
    # rotation_img(img)
    affine_img(img)

    cv2.namedWindow("normal")
    cv2.namedWindow("image")
    # cv2.imshow("image", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 


免責聲明!

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



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