python opencv 旋轉圖像 圖像內容不改變

幾何變換

幾何變換可以看成圖像中物體(或像素)空間位置改變,或者說是像素的移動。

幾何運算需要空間變換和灰度級差值兩個步驟的算法,像素通過變換映射到新的座標位置,新的位置可能是在幾個像素之間,即不一定爲整數座標。這時就需要灰度級差值將映射的新座標匹配到輸出像素之間。最簡單的插值方法是最近鄰插值,就是令輸出像素的灰度值等於映射最近的位置像素,該方法可能會產生鋸齒。這種方法也叫零階插值,相應比較複雜的還有一階和高階插值。

插值算法感覺只要瞭解就可以了,圖像處理中比較需要理解的還是空間變換。

空間變換

空間變換對應矩陣的仿射變換。一個座標通過函數變換的新的座標位置:


所以在程序中我們可以使用一個2*3的數組結構來存儲變換矩陣:


以最簡單的平移變換爲例,平移(b1,b2)座標可以表示爲:


因此,平移變換的變換矩陣及逆矩陣記爲:


縮放變換:將圖像橫座標放大(或縮小)sx倍,縱座標放大(或縮小)sy倍,變換矩陣及逆矩陣爲:


選擇變換:圖像繞原點逆時針旋轉a角,其變換矩陣及逆矩陣(順時針選擇)爲:

以上部分摘自:https://blog.csdn.net/xiaowei_cqu/article/details/7616044  

主要是介紹了下M的含義,爲之下的內容做準備.

import cv2
from math import *
import numpy as np

img = cv2.imread("3-2.jpg")

height,width=img.shape[:2]

degree=45
#旋轉後的尺寸
heightNew=int(width*fabs(sin(radians(degree)))+height*fabs(cos(radians(degree)))) # 這個公式參考之前內容
widthNew=int(height*fabs(sin(radians(degree)))+width*fabs(cos(radians(degree))))

matRotation=cv2.getRotationMatrix2D((width/2,height/2),degree,1)

matRotation[0,2] +=(widthNew-width)/2  # 因爲旋轉之後,座標系原點是新圖像的左上角,所以需要根據原圖做轉化
matRotation[1,2] +=(heightNew-height)/2  

imgRotation=cv2.warpAffine(img,matRotation,(widthNew,heightNew),borderValue=(255,255,255))

cv2.imshow("img",img)
cv2.imshow("imgRotation",imgRotation)
cv2.waitKey(0)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章