【学习笔记】opencv的python接口 几何变换
先跑一下示例代碼:
 平移:
 其中 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有三個返回值,然后我修改了其中一句話,加上了顯示的代碼,代碼改為:
運行能成功了,效果:
 
仿射變換:
介紹:
 仿射變換是指在向量空間中進行一次線性變換(乘以一個矩陣)并加上一個平移(加上一個向量),變換為另一個向量空間的過程。在有限維的情況下,每個仿射變換可以由一個矩陣A和一個向量b給出,它可以寫作A和一個附加的列b。**一個仿射變換對應于一個矩陣和一個向量的乘法,而仿射變換的復合對應于普通的矩陣乘法,**只要加入一個額外的行到矩陣的底下,這一行全部是0除了最右邊是一個1,而列向量的底下要加上一個1.
 我們能夠用仿射變換來表示:
旋轉 (線性變換)
 平移 (向量加)
 縮放操作 (線性變換)
 示例代碼:
然后記錄一下其中出現的函數和庫:
 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)
效果:
 
透視變換:
 代碼:
 感覺就是截取了其中一部分然后放大了?
重映射
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了
練習題:
? 將下面紙張通過變換調節至正中央水平豎直放置,最終呈現的圖片效果上要保留白紙外的區域:
 代碼:
其中scale_percent =100
 width = int(img.shape[1] * scale_percent / 100)
 height = int(img.shape[0] * scale_percent / 100)
 dim = (width, height)
 是用來調整圖片大小的。
自己修改了一下窗口大小,不然有點太大
 效果:
 
 另外兩邊不是豎直的無能為力了(這個紙應該是拍照角度原因四個角不是九十度)
總結
以上是生活随笔為你收集整理的【学习笔记】opencv的python接口 几何变换的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: task2:opencv的python接
 - 下一篇: javascript箭头函数和this的