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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图像旋转变换的推导

發布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像旋转变换的推导 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面我們提到了圖像的縮放變換,可以用矩陣乘法的形式來表達變換后的像素位置映射關系。

那么,對于旋轉變換呢?我們可以同樣將其想象成二維平面上矢量的旋轉。如下圖所示,矢量[x1,y1]逆時針旋轉θθ度到了[x2,y2]。

設定矢量的長度為s,根據坐標系定義,我們可以得到:
x2=s?cosβx2=s?cos?β

y2=s?sinβy2=s?sin?β
根據上面的圖形,有:
β=α+θβ=α+θ
因此:
x2=s?cos(α+θ)x2=s?cos?(α+θ) y2=s?sin(α+θ)y2=s?sin?(α+θ)
根據初中所學的三角函數公式:
sin(α+θ)=sinα?cosθ+cosα?sinθsin?(α+θ)=sinα?cosθ+cosα?sinθ cos(α+θ)=cosα?cosθ?sinα?sinθcos?(α+θ)=cosα?cosθ?sinα?sinθ 于是:
x2=s?cosα?cosθ?s?sinα?sinθx2=s?cosα?cosθ?s?sinα?sinθ y2=s?sinα?cosθ+s?cosα?sinθy2=s?sinα?cosθ+s?cosα?sinθ 由于:
x1=s?cosαx1=s?cos?α y1=s?sinαy1=s?sin?α 因此:
x2=x1?cosθ?y1?sinθx2=x1?cosθ?y1?sinθ y2=x1?sinθ+y1?cosθy2=x1?sinθ+y1?cosθ 于是,上式寫成矩陣乘法的形式如下:
[x2y2]=[cosθsinθ?sinθcosθ][x1y1](77)(77)[x2y2]=[cosθ?sinθsinθcosθ][x1y1]
我們來看看一個圖像逆時針旋轉180度的情況。

import cv2import numpy as np import mathlenna = cv2.imread("lenna256.png", 0) row, col = lenna.shapelenna_rotation = np.zeros_like(lenna)A = np.mat([[math.cos(math.pi), -math.sin(math.pi)], [math.sin(math.pi), math.cos(math.pi)]])for r in range(row):for l in range(col):v = np.dot(A.I, np.array([r, l]).T)lenna_rotation[r, l] = lenna[int(v[0, 0]), int(v[0, 1])]cv2.imshow("lenna", lenna) cv2.imshow("rotation", lenna_rotation) cv2.waitKey()

上面的圖像寬度和高度是一樣的,而且旋轉角度是180度,比較特殊。在一般情況下,我們需要注意的是2點:一是旋轉圖像一般要將旋轉中心設置在圖像的中心點位置;二是圖像旋轉后,可能越過了原來的圖像邊界范圍。這些都比較麻煩,好在opencv已經做好了這一切。

lenna = cv2.imread("lenna256.png", 0) row, col = lenna.shape M = cv2.getRotationMatrix2D((col // 2, row // 2), 70, 0.5) dst = cv2.warpAffine(lenna, M, (col, row)) cv2.imshow("rotation", dst) cv2.waitKey()

總結

以上是生活随笔為你收集整理的图像旋转变换的推导的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。