[OpenCV基礎][Python]warpPerspective透視變換

閱讀時間約 7 分鐘

當我們在拍照時,有時候會期望圖像中物體是呈現我們想要的樣子,就可以利用透視變換的方式,將物體捏造成我們想要的樣子。

當我們拍攝文件或書籍時,如果有角度和距離的變化,文件可能會變形。透視變換可用於校正這種變形,使文件呈現平整的視覺效果。

cv2.warpPerspective 是 OpenCV 中的一個函數,用於進行透視變換(Perspective Transformation)。透視變換是一種將二維圖像進行轉換的方法,通常用於將視角進行調整或者校正,例如在影像處理中對於傾斜的圖像進行矯正

傾斜矯正

傾斜矯正

cv2.warpPerspective 的語法:

cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
  • src:要進行透視變換的輸入圖像
  • M透視變換3x3變換矩陣
  • dsize:輸出圖像的大小,以元組(width, height)表示。

進階參數(可選擇不填,則會使用默認)

  • dst:輸出圖像,可選參數,如果未提供,則函數會創建一個與 dsize 相同大小的空白圖像。
  • flags:進行變換時的插值方法:
    cv2.INTER_NEAREST最近鄰插值,使用最近鄰的像素值進行插值,速度最快,但效果可能不夠平滑。
    cv2.INTER_LINEAR雙線性插值,使用相鄰四個像素的加權平均值,效果比最近鄰好一些,但計算成本較高。
    cv2.INTER_CUBIC雙三次插值,使用相鄰的16個像素進行插值,產生更平滑的效果,但計算成本最高。

  • borderMode:用於處理邊界模式:
    cv2.BORDER_CONSTANT常數邊界模式,邊界外的像素使用指定的常數值填充。
    cv2.BORDER_REFLECT反射邊界模式,邊界外的像素是邊界內像素的鏡像反射。
    cv2.BORDER_WRAP循環邊界模式,像素位置溢出時,回到相對應的另一邊。
  • borderMode 設定為 cv2.BORDER_CONSTANT 時:
    可以使用 borderValue 參數指定邊界常數值。這個值通常是一個顏色值,例如白色 (255, 255, 255) 或黑色 (0, 0, 0)

範例

# 指定邊界模式為 cv2.BORDER_CONSTANT,並設定邊界常數值為白色
border_mode = cv2.BORDER_CONSTANT
border_value = (255, 255, 255)

# 應用透視變換,並指定邊界模式和邊界常數值
result = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]),
borderMode=border_mode, borderValue=border_value)

透視變換的3x3變換矩陣說明:

M = | m11 m12 m13 |

| m21 m22 m23 |

| m31 m32 m33 |

m11m22是水平和垂直縮放因子,m12m21是切變因子,m13m23是平移因子,m31m32 m33 是透視因子。


程式範例

import cv2
import numpy as np

# 讀取輸入圖像
img = cv2.imread('123.JPG')

# 透視變換前的四個點,這些點可以是手動選取或使用檢測算法(例如角點檢測)
src_pts = np.array([[2700, 970], #左上
[6000, 60], #右上
[2600, 1400], #左下
[5500, 3300]], #右下
dtype=np.float32)

# 透視變換後的目標四個點
dst_pts = np.array([[100, 500], #左上
[6000, 500], #右上
[100, 3000], #左下
[6000, 3000]], #右下
dtype=np.float32)

# 計算透視變換矩陣 M
M = cv2.getPerspectiveTransform(src_pts, dst_pts)

# 應用透視變換
result = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))

# 顯示原始圖像和變換後的圖像

cv2.imshow('Original Image', img)
cv2.imshow('Perspective Transformed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

透視變換前的四個點

圖片是我大概標示,示意用,差不多位子方便理解而已。

src_pts = np.array([[2700, 970], #左上
[6000, 60], #右上
[2600, 1400], #左下
[5500, 3300]], #右下
dtype=np.float32)
透視前四個點標記位子

透視前四個點標記位子

透視變換後的目標四個點

透視變換後

透視變換後


科普名詞

透視變換:

當我們拍攝一個物體時,它可能因為角度或距離呈現變形,使得物體失真歪斜透視變換就是一種調整這種失真的方法,讓我們可以糾正或校正這些變形,使得圖像看起來更正確,更符合我們期望的形狀

數學表示方法

透視變換(Perspective Transformation)是一種非線性的幾何變換,它可以將一個二維空間中的點映射到另一個二維空間中,同時包含了線性變換(如平移、旋轉、縮放)以及透視變換

透視變換計算方式如下:

透視變換數學式

透視變換數學式

x,y是原始圖像中的座標,x′,y′,w′是變換後的座標,w 是齊次坐標中的權重(通常是1)

當齊次坐標中的 w 不等於 1 時,透視變換就會引入透視效應,從而使被變換的圖形發生變形。這是由於透視變換的特性


總結

更進階的應用是利用其他方式得到變換矩陣 M,來透視變換圖片中的物件。

可以參考我另外一篇文章,也可以利用SIFT偵測特徵點,來取得特徵物件的變換矩陣在矯正其圖像。

[OpenCV應用][Python]利用SIFT得取圖片物件旋轉角度,並旋轉回正常角度

119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
OpenCV 提供了多種用於邊緣偵測的方法,其中一些常見的包括 Sobel、Scharr、Laplacian,還有 Canny 邊緣檢測器。這些方法可以幫助我們檢測圖像中的暗明強度變化,從而找到物體的邊緣。
在生活中常看到的美圖秀秀或美圖修修或者其他圖像編輯軟體,通常使用各種濾波器和模糊化技術來實現照片的修飾和美化效果。這些濾波和模糊化技術可以應用於不同的區域,以改進照片的外觀,包括平滑皮膚、去除細節、調整對比度等。 本文會介紹 OpenCV 四種影像模糊化的方法
在影像處理中,我們總是會想把圖像內一些物件的特徵讓它明顯一點,形態學運算就是一個好用強大的工具。 形態學運算是圖像處理中的一個重要概念,用於改善或改變圖像的形狀。在OpenCV中,形態學運算提供了一系列操作,包括開運算、閉運算、禮帽運算和黑帽運算。這些操作通常應用於二值圖像,用於去除噪聲、連接物體
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
OpenCV 提供了多種用於邊緣偵測的方法,其中一些常見的包括 Sobel、Scharr、Laplacian,還有 Canny 邊緣檢測器。這些方法可以幫助我們檢測圖像中的暗明強度變化,從而找到物體的邊緣。
在生活中常看到的美圖秀秀或美圖修修或者其他圖像編輯軟體,通常使用各種濾波器和模糊化技術來實現照片的修飾和美化效果。這些濾波和模糊化技術可以應用於不同的區域,以改進照片的外觀,包括平滑皮膚、去除細節、調整對比度等。 本文會介紹 OpenCV 四種影像模糊化的方法
在影像處理中,我們總是會想把圖像內一些物件的特徵讓它明顯一點,形態學運算就是一個好用強大的工具。 形態學運算是圖像處理中的一個重要概念,用於改善或改變圖像的形狀。在OpenCV中,形態學運算提供了一系列操作,包括開運算、閉運算、禮帽運算和黑帽運算。這些操作通常應用於二值圖像,用於去除噪聲、連接物體
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
OpenCart 官方的 3.0.3.7 版於上周釋出,除了修正許多 3.0.x 版累積的小問題,也更新了 twig 套件解決了 PHP 7.4 的相容問題,所以 OpenCart 台灣電商技術團隊,也以 OpenCart 3.0.3.7 版為基礎,加上了在地優化及實用模組,推出台灣優化版。
Thumbnail
綠界科技雖然為 OpenCart 電商系統推出了可直接安裝使用的金流擴充模組,但其設計的模組架構,並不算完全符合 OpenCart 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
OpenCart 官方的 3.0.3.7 版於上周釋出,除了修正許多 3.0.x 版累積的小問題,也更新了 twig 套件解決了 PHP 7.4 的相容問題,所以 OpenCart 台灣電商技術團隊,也以 OpenCart 3.0.3.7 版為基礎,加上了在地優化及實用模組,推出台灣優化版。
Thumbnail
綠界科技雖然為 OpenCart 電商系統推出了可直接安裝使用的金流擴充模組,但其設計的模組架構,並不算完全符合 OpenCart 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。