<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
選擇一張shape為(500,500,3)的梵高的《星月夜》以便範例。
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
src 原圖(的陣列)
dsize: 輸出影象的大小 格式:(a,b)。
設定dsize後就無需再設定fx和fy
fx 可選引數 水平方向縮放比
fy 可選引數 垂直方向縮放比
fx和fy不同於dsize,fx和fy是各是一個比值,如設為2,則表示放大2倍,設為1/2則表示縮小到原來的1/2
import cv2 img = cv2.imread("The_Starry_Night.jpg") dst1 = cv2.resize(img, (200, 200)) dst2 = cv2.resize(img, (900, 900)) cv2.imshow("img", img) cv2.imshow("dst1", dst1) cv2.imshow("dst2", dst2) cv2.waitKey() cv2.destroyAllWindows()
執行結果如圖所示,相比原圖,影象得到了指定大小的縮小與放大。
使用fx和fy引數,則需要手動把dsize設為None。
import cv2 img = cv2.imread("The_Starry_Night.jpg") # 將寬縮小到原來的1/3、高縮小到原來的1/2 dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2) # 將寬高擴大2倍 dst4 = cv2.resize(img, None, fx=2, fy=2) cv2.imshow("img", img) cv2.imshow("dst3", dst3) cv2.imshow("dst4", dst4) cv2.waitKey() cv2.destroyAllWindows()
結果呈現:
flip(src, flipCode, dst=None)
src 影象(陣列)
flipCode 翻轉程式碼。可以是0,正數,負數。0表示沿X軸(水平方向的軸)翻轉。1表示沿Y軸(豎直方向的軸)翻轉。
負數表示同時沿X軸和Y軸翻轉。
講原圖經過著三種翻轉後,與原圖拼在一塊,呈現出了這種奇觀:
import cv2 img = cv2.imread("The_Starry_Night.jpg") dst1 = cv2.flip(img, 0) dst2 = cv2.flip(img, 1) dst3 = cv2.flip(img, -1) cv2.imshow("img", img) cv2.imshow("dst1", dst1) cv2.imshow("dst2", dst2) cv2.imshow("dst3", dst3) cv2.waitKey() cv2.destroyAllWindows()
將翻轉結果放在同一張畫布中
import cv2 import numpy as np img = cv2.imread("The_Starry_Night.jpg") dst1 = cv2.flip(img, 0) dst2 = cv2.flip(img, 1) dst3 = cv2.flip(img, -1) a, b, c = img.shape canvas = np.ones((2 * a, 2 * b, c), np.uint8) * 255 canvas[0:b, 0:a] = img canvas[b:2*b, 0:a] = dst1 canvas[0:b, a:2*a] = dst2 canvas[b:2*b, a:2*a] = dst3 cv2.imshow("pic", canvas) cv2.waitKey() cv2.destroyAllWindows() # 儲存圖片 # cv2.imwrite("final_pic", canvas)
結果呈現:
常見的仿射變換有平移,旋轉和傾斜變換。
仿射變換使用cv2.warpAffine()方法完成
warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
src 原圖
M 是一個二行三列的矩陣,也稱仿射矩陣。warpAffine方法根據此矩陣的值來變換畫素的位置。
M = [[a, b, c], [d, e, f]],則畫素的變換公式為:
X = x × a + y × b + c
Y = x × d + y × e + f
其中x,y指原畫素的x、y軸座標。X,Y指變換後的X,Y座標。
dsize 輸出影象的尺寸。(不帶放縮,增大的部分用黑色色素(0)填充)
這三個引數是常用的引數。其餘引數建議使用預設值。
flags表示插入方式,borderMode是邊界型別,borderValue表示邊界值(預設0)。dst表示反射變換後輸出的影象。
以將《星月夜》向左平移50個畫素,向下平移100個畫素為例。
則M陣列應寫為[[1, 0, 50], [0, 1, 100]]:
import cv2 import numpy as np img = cv2.imread("The_Starry_Night.jpg") rows = len(img) cols = len(img[0]) M = np.float32([[1, 0, 50], [0, 1, 100]]) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
如圖所示,影象按照我們的預期成功被平移。
只是這樣得到的影象有色素損失,我們丟失了超出畫布之外的資料。
為了避免損失,可以取設定dsize引數來控制輸出影象的大小。
修改後的程式碼如下:
import cv2 import numpy as np img = cv2.imread("The_Starry_Night.jpg") rows = len(img) cols = len(img[0]) M = np.float32([[1, 0, 50], [0, 1, 100]]) dst = cv2.warpAffine(img, M, (cols+200, rows+200)) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
優化後的程式執行效果:
旋轉也是通過M矩陣來實現的,這個矩陣的運算較複雜,
OpenCV提供了getRotationMatrix2D()方法來計算旋轉操作的M矩陣
getRotationMatrix2D(center, angle, scale)
center 指旋轉中心的座標
angle指旋轉的角度
scale值縮放的比例。(旋轉過程支援縮放)
import cv2 img = cv2.imread("The_Starry_Night.jpg") rows = len(img) cols = len(img[0]) center = (rows / 2, cols / 2) M = cv2.getRotationMatrix2D(center, 30, 0.8) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
旋轉效果如圖所示:
OpenCV需要定位到影象的三個點的位置來計算傾斜效果,即左上角,右上角和左下角。
影象的傾斜也是根據M矩陣實現,得出矩陣的運算較複雜,通過getAffineTransform 方法實現。
語法
getAffineTransform(src, dst)
src是原影象的左上角,右上角和左下角三個點的座標。三維陣列格式,形如[[a, b], [c, d], [e, f]]。
dst是傾斜後這三個點預期的座標。格式同上。
要保持左上,右下,左下三個點的順序不能亂。
以將《星月夜》保持左下角和右上角座標不變,左上角((0,0)處)向右移動150個畫素長度。
程式碼如下:
import cv2 import numpy as np img = cv2.imread("The_Starry_Night.jpg") rows = len(img) cols = len(img[0]) p1 = np.array([[0, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32) p2 = np.array([[150, 0], [cols - 1, 0], [0, rows - 1]], dtype=np.float32) M = cv2.getAffineTransform(p1, p2) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('img', img) cv2.imshow('dst', dst) cv2.waitKey() cv2.destroyAllWindows()
程式執行效果如下:
透視的實現使用的是warpPerspective()方法,而不再是用於平移、旋轉、傾斜的warpAffine()方法。
使用warpPerspective()方法也需要通過M矩陣來計算透視效果,計算透視的M矩陣可以使用getPerspectiveTransform()方法。
getPerspectiveTransform(src, dst, solveMethod=None)
該方法常用的引數有兩個,分別為原圖的四個點的座標(scr) 和 透視後四個點的座標(dst)。Opcv需要通過定點陣影象的這四個點來計算透視效果。四個點依次為左上,右上,左下,右下。
座標格式為二維陣列格式,形如[[a, b],[c, d],[e, f],[g, h]]。
範例程式碼如下:
import cv2 import numpy as np img = cv2.imread("The_Starry_Night.jpg") rows = len(img) cols = len(img[0]) # 原圖的四點座標 p1 = np.zeros((4, 2), np.float32) p1[0] = [0, 0] p1[1] = [cols - 1, 0] p1[2] = [0, rows - 1] p1[3] = [cols - 1, rows - 1] # 透視後的四點座標 p2 = np.zeros((4, 2), np.float32) p2[0] = [150, 0] p2[1] = [cols - 150, 0] p2[2] = [0, rows - 1] # 不變 p2[3] = [cols - 1, rows - 1] # 不變 M = cv2.getPerspectiveTransform(p1, p2) dst = cv2.warpPerspective(img, M, (cols, rows)) cv2.imshow('The_Starry_Night', img) cv2.imshow('The_Starry_Night2', dst) cv2.waitKey() cv2.destroyAllWindows()
展示原圖和透視後的影象效果:
到此這篇關於OpenCV實現常見的四種影象幾何變換的文章就介紹到這了,更多相關OpenCV影象幾何變換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45