python 几何教学_opencv-python教程学习系列11-几何变换
前言
opencv-python教程學(xué)習(xí)系列記錄學(xué)習(xí)python-opencv過程的點滴,本文主要介紹幾何變換,堅持學(xué)習(xí),共同進(jìn)步。
系統(tǒng)環(huán)境
系統(tǒng):win7_x64;
python版本:python3.5.2;
opencv版本:opencv3.3.1;
內(nèi)容安排
1.知識點介紹;
2.測試代碼;
具體內(nèi)容
1.知識點介紹;
主要涉及函數(shù)cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive;
1.1 縮放;
縮放僅僅改變圖像尺寸,opencv提供的函數(shù)cv2.resize()可以實現(xiàn)此功能。圖片的尺寸可以指定尺寸大小,或者指定縮放因子。可以使用不同的插值運(yùn)算方法,在縮放時推薦的插值運(yùn)算方法是 cv2.INTER_AREA,在擴(kuò)展時推薦使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默認(rèn)情況下改變圖像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一種方法改變圖像尺寸。
##None為圖像尺寸時,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 平移;
平移就是移動對象位置。如果你知道移動方向(x,y),移動距離是(tx,ty),可以創(chuàng)建如下矩陣。
可以使用Numpy數(shù)組構(gòu)建矩陣,數(shù)據(jù)類型是np.float32,然后將其傳入函數(shù)cv2.warpAffine();
函數(shù)cv2.warpAffine() 第三個參數(shù)是輸出圖像的大小,格式是圖像的(寬,高)。
注意,圖像的寬對應(yīng)的是列數(shù),高對應(yīng)的是行數(shù)。
M = np.float32([[1,0,100], [0,1,50]])
dst = cv2.warpAffine(img, M, (cols,rows))
1.3 旋轉(zhuǎn);
對一個圖像旋轉(zhuǎn)角度θ,旋轉(zhuǎn)矩陣如下:
在opencv中允許在任意地方進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)矩陣如下:
其中,
opencv提供了cv2.getRotationMatrix2D函數(shù)來實現(xiàn)旋轉(zhuǎn)矩陣;
M=cv2.getRotationMatrix2D((cols/2,rows/2), 45, 0.6)
#第三個參數(shù)是輸出圖像的尺寸中心
dst=cv2.warpAffine(img, M, (2*cols,2*rows))
1.4 仿射變換;
仿射變換中,原圖中的平行線變換后依然平行。創(chuàng)建仿射變換矩陣需要在圖像中找三個點和這三個點在輸出圖像的位置。使用cv2.getAffineTransform函數(shù)創(chuàng)建2*3的仿射變換矩陣,矩陣會被傳遞給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個點,以及他們在輸出圖像上的對應(yīng)位置,這四個點任意三個不能共線。由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.測試代碼;
2.1 縮放/旋轉(zhuǎn)等;
import cv2
img = cv2.imread('test.jpg',0)
rows,cols=img.shape
#這里的第一個參數(shù)為旋轉(zhuǎn)中心,第二個為旋轉(zhuǎn)角度,第三個為旋轉(zhuǎn)后的縮放因子
#可以通過設(shè)置旋轉(zhuǎn)中心,縮放因子以及窗口大小來防止旋轉(zhuǎn)后超出邊界的問題。
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
#第三個參數(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-几何变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信用卡新快现可以提前还款吗
- 下一篇: python医学数据挖掘_GitHub