python 几何教学_opencv-python教程学习系列11-几何变换
前言
opencv-python教程學(xué)習(xí)系列記錄學(xué)習(xí)python-opencv過(guò)程的點(diǎn)滴,本文主要介紹幾何變換,堅(jiān)持學(xué)習(xí),共同進(jìn)步。
系統(tǒng)環(huán)境
系統(tǒng):win7_x64;
python版本:python3.5.2;
opencv版本:opencv3.3.1;
內(nèi)容安排
1.知識(shí)點(diǎn)介紹;
2.測(cè)試代碼;
具體內(nèi)容
1.知識(shí)點(diǎn)介紹;
主要涉及函數(shù)cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive;
1.1 縮放;
縮放僅僅改變圖像尺寸,opencv提供的函數(shù)cv2.resize()可以實(shí)現(xiàn)此功能。圖片的尺寸可以指定尺寸大小,或者指定縮放因子。可以使用不同的插值運(yùn)算方法,在縮放時(shí)推薦的插值運(yùn)算方法是 cv2.INTER_AREA,在擴(kuò)展時(shí)推薦使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默認(rèn)情況下改變圖像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一種方法改變圖像尺寸。
##None為圖像尺寸時(shí),fx和fy參數(shù)是縮放因子
res = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#or
#這里直接設(shè)置輸出圖像的尺寸,所以不用設(shè)置縮放因子
height, width =img.shape[:2]
res = cv2.resize(img,(2*width, 2*height),interpolation=cv2.INTER_CUBIC)
#注意,integer argument expected;那怎么縮小呢??
1.2 平移;
平移就是移動(dòng)對(duì)象位置。如果你知道移動(dòng)方向(x,y),移動(dòng)距離是(tx,ty),可以創(chuàng)建如下矩陣。
可以使用Numpy數(shù)組構(gòu)建矩陣,數(shù)據(jù)類型是np.float32,然后將其傳入函數(shù)cv2.warpAffine();
函數(shù)cv2.warpAffine() 第三個(gè)參數(shù)是輸出圖像的大小,格式是圖像的(寬,高)。
注意,圖像的寬對(duì)應(yīng)的是列數(shù),高對(duì)應(yīng)的是行數(shù)。
M = np.float32([[1,0,100], [0,1,50]])
dst = cv2.warpAffine(img, M, (cols,rows))
1.3 旋轉(zhuǎn);
對(duì)一個(gè)圖像旋轉(zhuǎn)角度θ,旋轉(zhuǎn)矩陣如下:
在opencv中允許在任意地方進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)矩陣如下:
其中,
opencv提供了cv2.getRotationMatrix2D函數(shù)來(lái)實(shí)現(xiàn)旋轉(zhuǎn)矩陣;
M=cv2.getRotationMatrix2D((cols/2,rows/2), 45, 0.6)
#第三個(gè)參數(shù)是輸出圖像的尺寸中心
dst=cv2.warpAffine(img, M, (2*cols,2*rows))
1.4 仿射變換;
仿射變換中,原圖中的平行線變換后依然平行。創(chuàng)建仿射變換矩陣需要在圖像中找三個(gè)點(diǎn)和這三個(gè)點(diǎn)在輸出圖像的位置。使用cv2.getAffineTransform函數(shù)創(chuàng)建2*3的仿射變換矩陣,矩陣會(huì)被傳遞給cv2.warpAffine函數(shù);
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
#行,列,通道數(shù)
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols,rows))
1.5 透視變換;
透視變換需要3*3的矩陣,透視變換后直線還是直線,建立透視矩陣需要在圖像上找4個(gè)點(diǎn),以及他們?cè)谳敵鰣D像上的對(duì)應(yīng)位置,這四個(gè)點(diǎn)任意三個(gè)不能共線。由cv2.getPerspectiveTransform() 構(gòu)建矩陣,然后將矩陣傳遞給cv2.warpPerspective函數(shù);
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (300,300))
2.測(cè)試代碼;
2.1 縮放/旋轉(zhuǎn)等;
import cv2
img = cv2.imread('test.jpg',0)
rows,cols=img.shape
#這里的第一個(gè)參數(shù)為旋轉(zhuǎn)中心,第二個(gè)為旋轉(zhuǎn)角度,第三個(gè)為旋轉(zhuǎn)后的縮放因子
#可以通過(guò)設(shè)置旋轉(zhuǎn)中心,縮放因子以及窗口大小來(lái)防止旋轉(zhuǎn)后超出邊界的問(wèn)題。
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
#第三個(gè)參數(shù)是輸出圖像的尺寸中心
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
cv2.imshow('img',dst)
if cv2.waitKey(1)==27:
break
cv2.destroyAllWindows()
2.2 仿射/透視變換;
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('test.jpg')
rows,cols,ch=img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (300,300))
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('output')
plt.show()
參考
完
總結(jié)
以上是生活随笔為你收集整理的python 几何教学_opencv-python教程学习系列11-几何变换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中信信用卡新快现可以提前还款吗
- 下一篇: 【基础】Qt-VS调试器下载与配置