[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得取圖片物件旋轉角度,並旋轉回正常角度

留言
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
發文者
2024/02/08
[OpenCV基礎][Python]warpAffine仿射變換提及了這篇文章,趕快過去看看吧!
avatar-img
螃蟹_crab的沙龍
148會員
255內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/10/03
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
Thumbnail
2024/10/03
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
在影像處理中,我們總是想要讓特徵更加明顯一點,可以使用銳利化的方式將特徵的邊緣增強,提升影像的細節,圖像銳利後就會有提升解析度的感覺。 拉普拉斯運算子是一種常用於影像增強的方法之一,特別是用於提高影像的邊緣和細節。 在OpenCV中,你可以使用cv2.Laplacian函數來應用拉普拉斯運算子。
Thumbnail
在影像處理中,我們總是想要讓特徵更加明顯一點,可以使用銳利化的方式將特徵的邊緣增強,提升影像的細節,圖像銳利後就會有提升解析度的感覺。 拉普拉斯運算子是一種常用於影像增強的方法之一,特別是用於提高影像的邊緣和細節。 在OpenCV中,你可以使用cv2.Laplacian函數來應用拉普拉斯運算子。
Thumbnail
直方圖均衡化處理是一種通過調整圖像的直方圖來改變圖像外觀和質量的圖像處理技術。這通常涉及對圖像的亮度、對比度和顏色分佈進行調整 此方法對於背景和前景均亮或均暗的影像很有用。​並在曝光過度或曝光不足的照片中獲得更好的細節。
Thumbnail
直方圖均衡化處理是一種通過調整圖像的直方圖來改變圖像外觀和質量的圖像處理技術。這通常涉及對圖像的亮度、對比度和顏色分佈進行調整 此方法對於背景和前景均亮或均暗的影像很有用。​並在曝光過度或曝光不足的照片中獲得更好的細節。
Thumbnail
直方圖是對圖像中像素強度分布的圖形表示。通過分析直方圖,我們可以獲得有關圖像對比度、亮度和色彩分佈的有用信息。
Thumbnail
直方圖是對圖像中像素強度分布的圖形表示。通過分析直方圖,我們可以獲得有關圖像對比度、亮度和色彩分佈的有用信息。
Thumbnail
在某些特別的情況下,需要去調整亮度及對比度,讓我們想要的影像特徵更加明顯 本文將介紹利用這兩個函數 cv2.convertScaleAbs 和 cv2.addWeighted 來調整亮度及對比度。
Thumbnail
在某些特別的情況下,需要去調整亮度及對比度,讓我們想要的影像特徵更加明顯 本文將介紹利用這兩個函數 cv2.convertScaleAbs 和 cv2.addWeighted 來調整亮度及對比度。
Thumbnail
廢話不多說,先上成果圖。 成果圖 主要實現方法 1.灰階後利用cv2.Canny找物體的邊緣 2.找物件相對應的直線cv2.HoughLines 3.分類為橫向和垂直的直線角度,求得相對於物件的旋轉角度 4.根據算出的相對應旋轉角度將物件轉正
Thumbnail
廢話不多說,先上成果圖。 成果圖 主要實現方法 1.灰階後利用cv2.Canny找物體的邊緣 2.找物件相對應的直線cv2.HoughLines 3.分類為橫向和垂直的直線角度,求得相對於物件的旋轉角度 4.根據算出的相對應旋轉角度將物件轉正
Thumbnail
涉及圖像處理和計算機視覺時,色彩空間轉換是一個常見操作,應用如下: 降維: 將一張彩色圖像轉換為灰度圖像可以減少數據的維度,簡化處理過程,同時在某些情況下保留重要的視覺信息。 突顯特徵: 在某些情況下,某些色彩通道可能包含冗餘或不必要的信息,通過轉換到其他色彩空間,可以更好地突顯圖像中的重要特徵
Thumbnail
涉及圖像處理和計算機視覺時,色彩空間轉換是一個常見操作,應用如下: 降維: 將一張彩色圖像轉換為灰度圖像可以減少數據的維度,簡化處理過程,同時在某些情況下保留重要的視覺信息。 突顯特徵: 在某些情況下,某些色彩通道可能包含冗餘或不必要的信息,通過轉換到其他色彩空間,可以更好地突顯圖像中的重要特徵
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News