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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 几何教学_opencv-python教程学习系列11-几何变换

發(fā)布時間:2023/12/10 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 几何教学_opencv-python教程学习系列11-几何变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。