小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python+opencv圖像處理(十二)

 pythonjava學(xué)習(xí) 2021-04-06

圖像仿射變換和透視變換

天晴了......
1、仿射變換
圖像仿射變換就是圖像的旋轉(zhuǎn)加上拉升,說直白點(diǎn),就是把矩形變成平行四邊形。
要把矩形變成平行四邊行,只需要拉伸其四個(gè)角點(diǎn)就行了,事實(shí)上,只需要確定前面三個(gè)點(diǎn),最后一個(gè)點(diǎn)自然就能確定了。
也就是要改變下圖所示的三個(gè)點(diǎn)的值,對(duì)應(yīng)到新的平行四邊形上相應(yīng)的三個(gè)點(diǎn)即可。

這三個(gè)原點(diǎn)以及三個(gè)變換后的點(diǎn)呢,就組成了一個(gè)變換矩陣M。
opencv提供了根據(jù)變換前后三個(gè)點(diǎn)的對(duì)應(yīng)關(guān)系來自動(dòng)求解M。這個(gè)函數(shù)是M=cv2.getAffineTransform(pos1,pos2),其中兩個(gè)位置就是變換前后的對(duì)應(yīng)位置關(guān)系。輸出的就是仿射矩陣M
然后在使用函數(shù)cv2.warpAffine()即可完成仿射變換。
如下圖所示,左圖是原圖,右圖是仿射變換之后的結(jié)果圖。

其代碼如下:
from matplotlib import pyplot as plt
import cv2
import numpy as np
img = cv2.imread('E:/image/le.jpg')
print(img.shape)
rows,cols = img.shape[:2]
pts1 = np.float32([[0,0],[rows-1,0],[0,cols-1]])#原來三個(gè)點(diǎn)的位置
pts2 = np.float32([[20,20],[rows-50,50],[100,cols-100]])#變換后三個(gè)點(diǎn)的位置
M = cv2.getAffineTransform(pts1,pts2)#合成變換矩陣
res = cv2.warpAffine(img,M,(cols,rows))#第三個(gè)參數(shù):變換后的圖像大小
#顯示圖像
plt.subplot(121)
plt.imshow(img[:,:,[2,1,0]])
plt.axis('off')
plt.title("yuan")
plt.subplot(122)
plt.imshow(res[:,:,[2,1,0]])
plt.axis('off')
plt.title("dst")
plt.show()
2、透視變換
對(duì)于透視變換,需要確定四個(gè)點(diǎn)的位置,其四個(gè)點(diǎn)對(duì)應(yīng)的位置如下圖。

可以通過opencv的函數(shù)cv2.getPerspectiveTransform找到變換矩陣. 然后將cv2.warpPerspective應(yīng)用于此3x3變換矩陣,即可完成透視變換
有一種說法是說,通過透視變換可以將平行四邊形變?yōu)榫匦巍?/span>
如下圖所示,左圖為原圖,右圖為透視變換后的圖。

其代碼如下:
import cv2
import numpy as np
import matplotlib.pylab  as plt
img = cv2.imread('E:/image/ch.jpg')
print(img.shape)
rows,cols,ch = img.shape
pts1 = np.float32([[20,20],[rows-50,50],[0,cols],[rows-50,cols-50]])#原圖四個(gè)角點(diǎn)的位置,我的第三個(gè)點(diǎn)位置沒找對(duì),所以結(jié)果圖只有1,2,4三個(gè)點(diǎn)進(jìn)行了拉伸,而第3個(gè)點(diǎn)沒變。
pts2 = np.float32([[0,0],[rows,0],[0,cols],[rows,cols]])#結(jié)果圖的四個(gè)點(diǎn)對(duì)應(yīng)的位置,我這里是四個(gè)頂點(diǎn)
M = cv2.getPerspectiveTransform(pts1,pts2)#合成變換矩陣
dst = cv2.warpPerspective(img,M,(cols,rows))#進(jìn)行變換
#以下為顯示圖像
plt.subplot(121),plt.imshow(img[:,:,[2,1,0]]),plt.title('Input'),plt.axis('off')
plt.subplot(122),plt.imshow(dst[:,:,[2,1,0]]),plt.title('Output'),plt.axis('off')
plt.show()

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多