日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三维错切变换矩阵_图像的仿射变换

發(fā)布時間:2024/7/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三维错切变换矩阵_图像的仿射变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄:

  • 概述
  • 圖像基本變換
  • 仿射變換
  • 原理
  • python實現(xiàn)
  • 一、概述

    圖像的幾何變換主要包括:平移、縮放、旋轉(zhuǎn)、仿射、透視等等。圖像變換是建立在矩陣運算基礎(chǔ)上的,通過矩陣運算可以很快的找到不同圖像的對應(yīng)關(guān)系。理解變換的原理需要理解變換的構(gòu)造方法以及矩陣的運算方法。

    圖像的幾何變換主要分為三類:剛性變換、仿射變換和透視變換,如下圖:

    仿射變換是從一個二維坐標系變換到另一個二維坐標系,屬于線性變換。通過已知3對坐標點可以求得變換矩陣。

    透視變換是從一個二維坐標系變換到一個三維坐標系,屬于非線性變換。通過已知4對坐標點可以求得變換矩陣。

    二、圖像基本變換

    圖像的幾何變換包含很多變換,其中有一些基本變換,而仿射變換和透視變換就是對這些基本變換進行組合實現(xiàn)的。

    基本變換具體包括:平移(Translation)、縮放(Scale)、旋轉(zhuǎn)(Rotation)、翻轉(zhuǎn)(Flip)和錯切(Shear)。

    a. 平移

    b. 縮放

    c. 旋轉(zhuǎn)

    d. 翻轉(zhuǎn)

    e. 錯切

    錯切亦稱為剪切或錯位變換,包含水平錯切和垂直錯切,常用于產(chǎn)生彈性物體的變形處理。

    下面這張圖可能更形象:

    三、仿射變換

    3.1、原理

    對于二維坐標系的一個坐標點(x,y),可以使用一個2x2矩陣來調(diào)整x,y的值,而通過調(diào)整x,y可以實現(xiàn)二維形狀的線性變換(旋轉(zhuǎn),縮放),所以整個轉(zhuǎn)換過程就是對(x,y)調(diào)整的過程。

    仿射變換(Affine Transformation)是指在向量空間中進行一次線性變換(乘以一個矩陣)和一次平移(加上一個向量),變換到另一個向量空間的過程。

    仿射變換代表的是兩幅圖之間的映射關(guān)系,仿射變換矩陣為2x3的矩陣,如下圖中的矩陣M,其中的B起著 平移 的作用,而A中的對角線決定 縮放,反對角線決定 旋轉(zhuǎn) 或 錯切。

    所以仿射變換可以由一個矩陣A和一個向量B給出:

    原像素點坐標(x,y),經(jīng)過仿射變換后的點的坐標是T,則矩陣仿射變換基本算法原理:

    所以仿射變換是一種二維坐標(x, y)到二維坐標(u, v)的線性變換,其數(shù)學表達式如下:

    其實到這里還沒完,我們知道縮放和旋轉(zhuǎn)通過矩陣乘法來實現(xiàn),而平移是通過矩陣加法來實現(xiàn)的,為了將這幾個操作都通過一個矩陣來實現(xiàn),所以構(gòu)造出了上面那個 2x3 的矩陣。

    但是這個會改變圖像的尺寸,比如一個 2x2 的圖像,乘以 2x3 的矩陣,會得到 2x3 的圖像,所以為了解決這個問題,我們就增加一個維度,也就是構(gòu)造齊次坐標矩陣。

    關(guān)于齊次坐標的更多內(nèi)容可以查看這里,還有這里。

    最終得到的齊次坐標矩陣表示形式為:

    仿射變換保持了二維圖像的“平直性”和“平行性”:

    平直性:

    • 直線經(jīng)仿射變換后還是直線
    • 圓弧經(jīng)仿射變換后還是圓弧

    平行性:

    • 直線之間的相對位置關(guān)系保持不變
    • 平行線經(jīng)仿射變換后依然為平行線
    • 直線上點的位置順序不會發(fā)生變化
    • 向量間夾角可能會發(fā)生變化

    3.2、python實現(xiàn)

    通過仿射變換將圖片中的每個像素點按照一定的規(guī)律映射到新的位置,仿射變化需要一個轉(zhuǎn)換矩陣,但是由于仿射變換比較復雜,一般很難直接找到這個矩陣,opencv提供了根據(jù)源圖像和目標圖像上三個對應(yīng)的點來自動創(chuàng)建變換矩陣,矩陣維度為 2x3。

    兩個圖像中非共線的三對對應(yīng)點確定唯一的一個仿射變換。經(jīng)仿射變換后,圖像中的三個關(guān)鍵點依然構(gòu)成三角形,但三角形形狀已經(jīng)發(fā)生變化。

    這個函數(shù)是 cv2.getAffineTransform(pos1,pos2),其中兩個位置就是變換前后的對應(yīng)位置關(guān)系。輸出的就是仿射矩陣M,最后這個矩陣會被傳給函數(shù) cv2.warpAffine() 來實現(xiàn)仿射變換。

    原圖為:

    import cv2 import numpy as np img = cv2.imread('image0.jpg', 1) height, width = img.shape[:2] # 405x413 # 在原圖像和目標圖像上各選擇三個點 matSrc = np.float32([[0, 0],[0, height-1],[width-1, 0]]) matDst = np.float32([[0, 0],[30, height-30],[width-30, 30]]) # 得到變換矩陣 matAffine = cv2.getAffineTransform(matSrc, matDst) # 進行仿射變換 dst = cv2.warpAffine(img, matAffine, (width,height))

    變換矩陣的數(shù)據(jù)類型是 np.float32,函數(shù) cv2.warpAffine() 的第三個參數(shù)是輸出圖像的尺寸(寬,高)。

    仿射變換后的圖:

    因為平移和縮放的矩陣的比較簡單,我們可以直接手動指定。

    # 圖像平移 # 移位矩陣,水平方向移動100個像素,豎直方向移動200個像素 matShift = np.float32([[1,0,100],[0,1,200]]) # 2行3列 dst = cv2.warpAffine(img, matShift, (width,height)) # 圖像縮放 # 縮放矩陣,長寬各縮放一半 matScale = np.float32([[0.5,0,0],[0,0.5,0]]) dst = cv2.warpAffine(img, matScale, (int(width/2),int(height/2)))

    向左下平移:

    縮小50%:

    要實現(xiàn)圖像旋轉(zhuǎn),需要通過 cv2.getRotationMatrix2D 來得到二維旋轉(zhuǎn)變換矩陣(2行3列)。

    cv2.getRotationMatrix2D 三個參數(shù)分別為:1.旋轉(zhuǎn)中心,2.旋轉(zhuǎn)角度,3.縮放比例。角度為正,則圖像逆時針旋轉(zhuǎn),旋轉(zhuǎn)后圖像可能會超出邊界。

    matRotate = cv2.getRotationMatrix2D((width*0.5, height*0.5), 45, 1.0) dst = cv2.warpAffine(img, matRotate, (width,height))


    如果覺得有用,點個贊吧(? ??_??)?。

    總結(jié)

    以上是生活随笔為你收集整理的三维错切变换矩阵_图像的仿射变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。