仿射
在OpenCV中畦娄,仿射變換是指圖像經(jīng)過一系列的幾何變換來實(shí)現(xiàn)的平移,旋轉(zhuǎn)等多種操作弊仪。該變換能夠保持圖像的平直性與平行性熙卡。平直性是指圖像經(jīng)過仿射變換后,直線仍然是直線励饵;平行性是指圖像在完成仿射變換后驳癌,平行性依然是平行線。
在OpenCV中役听,它給我們提供的仿射函數(shù)為cv2.warpAffine()颓鲜,其通過一個變換矩陣M實(shí)現(xiàn),對于矩陣運(yùn)算不大了解的典予,可以記住后面講解的甜滨,也可以學(xué)習(xí)離散數(shù)學(xué)或線性代數(shù),兩者都講解到了矩陣運(yùn)算瘤袖。
仿射函數(shù)的定義如下:
def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):
src:代表要仿射的原始圖像
M:代表一個2*3的變換矩陣衣摩,使用不同的變換矩陣,就可以實(shí)現(xiàn)不同的仿射變換捂敌。
dszie:代表輸出圖像的尺寸大小艾扮。
dst:代表仿射后的輸出圖像
flags:代表插值方法既琴,默認(rèn)為INTER_LINEAR。當(dāng)該值為WARP_INVERSE_MAP時栏渺,意味著M是逆變換類型,實(shí)現(xiàn)從目標(biāo)圖像dst到原始圖像src的逆變換锐涯。詳細(xì)參數(shù)磕诊,上篇博文表格就是。
borderMode:代表邊類型纹腌,默認(rèn)為BORDER_CONSTANT霎终。當(dāng)該值為BORDER_TRANSPARENT時,意味著目標(biāo)圖像內(nèi)的值不做改變升薯,這些值對應(yīng)原始圖像內(nèi)的異常值莱褒。
borderValue:代表邊界值,默認(rèn)是0涎劈。
綜上所示广凸,我們常用的參數(shù)為:src,M,dsize。
平移
已知仿射公式為:
假設(shè)我們現(xiàn)在要將圖像向右平移50個像素蛛枚,向下平移100個像素谅海,那么公式替換后如下所示:
dst(x,y)=src(x+50,y+100)
dst(x,y)=src(1x,+0y+50,0x+1y+100)
得到M中的各個元素值為:
M11=1
M12=0
M13=50
M21=0
M22=1
M23=100
綜上所述,右平移50個像素蹦浦,向下平移100個像素的變換矩陣為:
已知變換矩陣與原始圖像扭吁,那么很簡單的我們就可以完成圖像的平移操作,具體代碼如下所示:
import cv2
import numpy as np
img = cv2.imread("4.jpg")
h, w = img.shape[:2]
x = 50
y = 100
M = np.float32([[1, 0, x], [0, 1, y]])
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行之后盲镶,效果如下所示:
旋轉(zhuǎn)
在使用函數(shù)cv2.warpAffine()對圖像進(jìn)行旋轉(zhuǎn)時侥袜,可以通過函數(shù)cv2.getRotationMatrix2D()獲取轉(zhuǎn)換矩陣。該函數(shù)的語法格式為:
def getRotationMatrix2D(center, angle, scale):
center:為旋轉(zhuǎn)的中心
angle:為旋轉(zhuǎn)的角度溉贿,正數(shù)表示逆時針旋轉(zhuǎn)枫吧,負(fù)數(shù)表示順時針旋轉(zhuǎn)
scale:為變換尺寸(也就是前文說的縮放大小)
下面宇色,我們來將上圖在旋轉(zhuǎn)45度由蘑,具體代碼如下所示:
import cv2
img = cv2.imread("4.jpg")
h, w = img.shape[:2]
M = cv2.getRotationMatrix2D((w / 2, h / 2), 45, 0.6)
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()
更改M變換矩陣就行,這里(w / 2, h / 2)為圖像的中心坐標(biāo)代兵,45為正數(shù)尼酿,就是逆時針旋轉(zhuǎn)45度,0.6就是將圖像縮放0.6倍植影。
運(yùn)行之后裳擎,效果如下所示: