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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【学习笔记】opencv的python接口 几何变换

發(fā)布時間:2024/9/30 python 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】opencv的python接口 几何变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先跑一下示例代碼:
平移:

import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('66.png') imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] mode = imgInfo[2]dst = np.zeros(imgInfo, np.uint8)for i in range( height ):for j in range( width - 100 ):dst[i, j + 0] = img[i, j]cv.imshow('image', dst) cv.waitKey(0)


其中 dst[i, j + 0] = img[i, j]是控制平移的距離的,可以看到上面的右邊黑色的一塊是平移的效果,如果寫成dst[i,j+100] = img[i,j]則效果為:

縮放:

import cv2 as cv import numpy as npimg=cv.imread('me1.jpg') # 下面的 None 本應該是輸出圖像的尺寸,但是因為后邊我們設置了縮放因子 # 因此這里為 None res=cv.resize(img,None,fx=2,fy=2,interpolation=cv.INTER_CUBIC) #OR # 這里呢,我們直接設置輸出圖像的尺寸,所以不用設置縮放因子 height,width=img.shape[:2] res=cv.resize(img,(2*width,1*height),interpolation=cv.INTER_CUBIC) while(1):cv.imshow('res',res)cv.imshow('img',img)if cv.waitKey(1) & 0xFF == 27:break cv.destroyAllWindows()

自己修改了一下width和height前面的系數,運行結果:

效果大概就是圖片明顯被拉長了。然后這個系數只能是整數,感覺有點不實用

關于旋轉

示例代碼是:

img = cv.imread('messi5.jpg',0) rows,cols = img.shape # cols-1 and rows-1 are the coordinate limits. M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1) dst = cv.warpAffine(img,M,(cols,rows))

我運行了以后顯示:

查了一下大概是shape有三個返回值,然后我修改了其中一句話,加上了顯示的代碼,代碼改為:

rols,cols,color = img.shape M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1) dst = cv.warpAffine(img,M,(cols,rows)) cv.imshow("ye",dst) cv.waitKey()

運行能成功了,效果:

仿射變換:

介紹:
仿射變換是指在向量空間中進行一次線性變換(乘以一個矩陣)并加上一個平移(加上一個向量),變換為另一個向量空間的過程。在有限維的情況下,每個仿射變換可以由一個矩陣A和一個向量b給出,它可以寫作A和一個附加的列b。**一個仿射變換對應于一個矩陣和一個向量的乘法,而仿射變換的復合對應于普通的矩陣乘法,**只要加入一個額外的行到矩陣的底下,這一行全部是0除了最右邊是一個1,而列向量的底下要加上一個1.
我們能夠用仿射變換來表示:

旋轉 (線性變換)
平移 (向量加)
縮放操作 (線性變換)
示例代碼:

import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('1.jpg') rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv.getAffineTransform(pts1,pts2) dst = cv.warpAffine(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()

然后記錄一下其中出現的函數和庫:
1.Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案.
2.getAffineTransform函數

函數作用:
主要用于生成仿射變換矩陣
一個任意的仿射變換都能表示為 乘以一個矩陣 (線性變換) 接著再 加上一個向量 (平移).
3.warpAffine函數使用如下矩陣進行圖像轉換

4.個人覺得np.float32就是生成一個矩陣,用pts1保存
5.subplot(nrows,ncols,plot_number) 如subplot(2,3,4)可以寫成sublot(234)

效果:

透視變換:
代碼:

import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('1.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 = cv.getPerspectiveTransform(pts1,pts2) dst = cv.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()


感覺就是截取了其中一部分然后放大了?

重映射

img = cv2.imread("p7.jpg",cv2.IMREAD_UNCHANGED) rows,cols = img.shape[:2] msx = np.ones((rows,cols),np.float32)*200 msy = np.ones((rows,cols),np.float32)*100 dst = cv2.remap(img,msx,msy,cv2.INTER_LINEAR) cv2.imshow("i",img) cv2.imshow("d",dst)

mapx:用來指定列的參數均為200
mapy:用來指定行的參數均為100
在函數 cv2.remap()中,參數map1和參數map2用來說明反向映射,map1針對的是坐標x,map2針對的是坐標y。
參數map1指代的是像素點所在位置的列號,參數map2指代的是像素點所在位置的行號。

用remap實現翻轉

代碼:

img = np.random.randint(0,256,size=[4,5],dtype=np.uint8) i1 = np.zeros(img.shape,np.float32) #x坐標軸的值保持不變 i2 = np.zeros(img.shape,np.float32) # y坐標軸為總行號-1-當前行號 rows,cols = img.shape for i in range(rows):for j in range(cols):i1.itemset((i,j),j)i2.itemset((i,j),rows - i -1)RST = cv2.remap(img,i1,i2,cv2.INTER_LINEAR) print(RST) print(img)

注意函數: i1.itemset((i,j),j)

交換x和y軸

img = np.random.randint(0,256,size=[4,5],dtype=np.uint8) i1 = np.zeros(img.shape,np.float32) #x坐標軸的值保持不變 i2 = np.zeros(img.shape,np.float32) # y坐標軸為總行號-1-當前行號 rows,cols = img.shape for i in range(rows):for j in range(cols):i1.itemset((i,j),i)i2.itemset((i,j),j)RST = cv2.remap(img,i1,i2,cv2.INTER_LINEAR) print(RST) print(img)


結果出現了0,可見行列數不一樣時運算中存在值無法映射的情況,無法完成映射的值被處理為0了

練習題:

? 將下面紙張通過變換調節(jié)至正中央水平豎直放置,最終呈現的圖片效果上要保留白紙外的區(qū)域:


代碼:

import cv2 as cvimg = cv.imread('shu.png') rows,cols,color = img.shape # cols-1 and rows-1 are the coordinate limits. scale_percent =100 M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),-140,1) width = int(img.shape[1] * scale_percent / 100) height = int(img.shape[0] * scale_percent / 100) dim = (width, height)resized = cv.resize(img, dim, interpolation = cv.INTER_AREA); dst = cv.warpAffine(resized,M,(cols,rows)) cv.namedWindow("enhanced",0); #cv.resizeWindow("enhanced", 500, 480);cv.imshow("enhanced",dst) cv.waitKey()

其中scale_percent =100
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
是用來調整圖片大小的。

自己修改了一下窗口大小,不然有點太大
效果:

另外兩邊不是豎直的無能為力了(這個紙應該是拍照角度原因四個角不是九十度)

總結

以上是生活随笔為你收集整理的【学习笔记】opencv的python接口 几何变换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。