Python圖像處理之透視變換的實戰應用
1 引言
如果你想對圖像進行校準,那麼透視變換是非常有效的變換手段。透視變換的定義為將圖像投影到一個新的視平面,通常也被稱之為投影映射。
2 公式
一般來說,通用的圖像變換公式如下所示:
上述公式中,u,v代表原始圖像坐標,x,y為經過透視變換的圖片坐標,其中變換矩陣為3X3形式。進而可以得到:
3 舉例
在介紹opencv的透視變換函數之前,我們舉例來講解該算法的原理:
直觀的來看,透視變換的作用就是將左側圖像的坐標點
[[50,0],[150,0],[0,200],[200,200]]
轉化為新的坐標
[[0,0],[200,0],[0,200],[200,200]]
通過計算我們知道,轉換矩陣如下:
我們來驗證一下,采用左上角的點(50,0)帶入公式,如下:
接著我們將列向量的前兩維度除以第三維執行歸一化:
所以我們知道原圖左上角點執行透視變換後的映射關系:
4 應用
本文以撲克牌的例子來進行講解,樣例結果如下:
4.1 讀入圖像
首先我們來讀入一副彩色圖像,如下:
import cv2 import numpy as np img = cv2.imread("image/sample.jpg") h, w, c = img.shape # h=240 w=320
4.2 挑選源圖四個點
接著我們需要挑選四個點,我們這裡采用左上,左下,右下和右上,下面的代碼把我們挑選的四個點畫到圖像上
src_list = [(61, 70), (151, 217), (269, 143), (160, 29)] for i, pt in enumerate(src_list): cv2.circle(img, pt, 5, (0, 0, 255), -1) cv2.putText(img,str(i+1),(pt[0]+5,pt[1]+10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) pts1 = np.float32(src_list)
結果如下:
4.3 進行透視變換
首先選擇四個目的圖像上的點,然後調用openv函數進行透視變換,代碼如下:
pts2 = np.float32([[0, 0], [0, w - 2], [h - 2, w - 2], [h - 2, 0]]) matrix = cv2.getPerspectiveTransform(pts1, pts2) result = cv2.warpPerspective(img, matrix, (h, w)) cv2.imshow("Image", img) cv2.imshow("Perspective transformation", result) cv2.waitKey(0)
得到結果如下:
5 應用
我們在實際應用中,可以使用透視變換來替換廣告牌中對應的背景圖,結果如下:
廣告牌:
Logo圖:
結果圖:
6 總結
本文介紹瞭圖像處理透視變換的原理和具體代碼實現,並給出瞭具體應用示例。
到此這篇關於Python圖像處理之透視變換的文章就介紹到這瞭,更多相關Python圖像透視變換內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
7 參考
參考 鏈接一 鏈接二
推薦閱讀:
- 基於Python的OpenCV骨架化圖像並顯示(skeletonize)
- OpenCV+Python幾何變換的實現示例
- python中opencv圖像疊加、圖像融合、按位操作的具體實現
- 教你如何用Python實現人臉識別(含源代碼)
- C++和OpenCV實現圖像字符化效果