[OpenCV基礎][Python]warpAffine仿射變換

更新於 發佈於 閱讀時間約 6 分鐘

warpAffinewarpPerspective 都是 OpenCV 中用於圖像變換的函數,主要差異在於這兩種函數所使用的變換矩陣的類型和適用場景。

本文主要討論warpAffine,另外warpPerspective可以此篇文章

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

仿射變換是一種線性的直線的、平行性幾何變換,將一個二維空間中的點映射另一個二維空間中。這種變換可以包括平移、旋轉、縮放、剪切等操作。

仿射變換可以用warpAffine()來實現。結果圖如下

仿射變換前後比較

仿射變換前後比較


差異

warpAffine:仿射變換

  • 變換矩陣類型: 2x3 的仿射變換矩陣。
  • 適用場景: 保持直線在變換後仍然是直線平行線依然保持平行簡單的平。適用於移、旋轉、縮放等變換,但無法處理透視變換。

warpPerspective:透視變換

  • 變換矩陣類型: 3x3 的透視變換矩陣。
  • 適用場景: 除了可以進行仿射變換外,還能處理透視變換,即使平行線在變換後也可能不再平行。這使得它適用於更廣泛的應用,如文件矯正、校正透視變形等。
圖像座標表示方法

圖像座標表示方法


語法

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
  • src:要進行透視變換的輸入圖像
  • M透視變換2x3變換矩陣
  • 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)

參數幾乎與warpPerspective相似,主要區別在於變換矩陣 M 的大小和形式,以及 warpPerspective 能夠處理更一般的透視變換,而 warpAffine 僅能處理保持平行線的仿射變換。


程式範例 - 平移

import cv2
import numpy as np

# 讀取輸入圖像
img = cv2.imread('input_image.jpg')

# 指定物體的位移量(平移50個像素到右下方)
tx, ty = 50, 50

# 定義仿射變換矩陣 M
M = np.float32([[1, 0, tx], [0, 1, ty]])

# 應用仿射變換
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

# 顯示原始圖像和變換後的圖像
cv2.imshow('Original Image', img)
cv2.imshow('Affine Transformed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
平移比較

平移比較


程式範例 - 縮放、剪切

import cv2
import numpy as np

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

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

# 仿射變換後的目標三個點
dst_pts = np.array([[0, 0], #左上
[6000, 0], #右上
[6000, 3368]], #右下
dtype=np.float32)

# 計算仿射變換矩陣 M
M = cv2.getAffineTransform(src_pts, dst_pts)

# 應用仿射變換
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

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

cv2.imshow('Original Image', img)
cv2.imshow('warpAffine Transformed Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
仿射變換前,原圖標示座標

仿射變換前,原圖標示座標

仿射變換後

仿射變換後


數學表示法:

一個二維仿射變換可以表示為以下的矩陣形式:

x,y 是原始圖像中的座標,x′,y′ 是變換後的座標,矩陣中的a,b,c,d,e,f 是變換矩陣的參數。

  • ae控制縮放(縮放因子),當它們不等於1時,進行縮放操作。
  • bd控制剪切,當它們不等於0時,進行剪切操作。
  • cf控制平移,它們是平移的量。
仿射變換數學式

仿射變換數學式

簡單來說,對於一個點 (x,y),使用變換矩陣進行仿射變換的計算就是將這個點的坐標應用於變換矩陣的線性運算


根據本身的需求來選擇要透視變換還是仿射變換吧
















avatar-img
134會員
222內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
當我們在拍照時,有時候會期望圖像中物體是呈現我們想要的樣子,就可以利用透視變換的方式,將物體捏造成我們想要的樣子。 當我們拍攝文件或書籍時,如果有角度和距離的變化,文件可能會變形。透視變換可用於校正這種變形,使文件呈現平整的視覺效果。 cv2.warpPerspective
OpenCV 提供了多種用於邊緣偵測的方法,其中一些常見的包括 Sobel、Scharr、Laplacian,還有 Canny 邊緣檢測器。這些方法可以幫助我們檢測圖像中的暗明強度變化,從而找到物體的邊緣。
在生活中常看到的美圖秀秀或美圖修修或者其他圖像編輯軟體,通常使用各種濾波器和模糊化技術來實現照片的修飾和美化效果。這些濾波和模糊化技術可以應用於不同的區域,以改進照片的外觀,包括平滑皮膚、去除細節、調整對比度等。 本文會介紹 OpenCV 四種影像模糊化的方法
在影像處理中,我們總是會想把圖像內一些物件的特徵讓它明顯一點,形態學運算就是一個好用強大的工具。 形態學運算是圖像處理中的一個重要概念,用於改善或改變圖像的形狀。在OpenCV中,形態學運算提供了一系列操作,包括開運算、閉運算、禮帽運算和黑帽運算。這些操作通常應用於二值圖像,用於去除噪聲、連接物體
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
當我們在拍照時,有時候會期望圖像中物體是呈現我們想要的樣子,就可以利用透視變換的方式,將物體捏造成我們想要的樣子。 當我們拍攝文件或書籍時,如果有角度和距離的變化,文件可能會變形。透視變換可用於校正這種變形,使文件呈現平整的視覺效果。 cv2.warpPerspective
OpenCV 提供了多種用於邊緣偵測的方法,其中一些常見的包括 Sobel、Scharr、Laplacian,還有 Canny 邊緣檢測器。這些方法可以幫助我們檢測圖像中的暗明強度變化,從而找到物體的邊緣。
在生活中常看到的美圖秀秀或美圖修修或者其他圖像編輯軟體,通常使用各種濾波器和模糊化技術來實現照片的修飾和美化效果。這些濾波和模糊化技術可以應用於不同的區域,以改進照片的外觀,包括平滑皮膚、去除細節、調整對比度等。 本文會介紹 OpenCV 四種影像模糊化的方法
在影像處理中,我們總是會想把圖像內一些物件的特徵讓它明顯一點,形態學運算就是一個好用強大的工具。 形態學運算是圖像處理中的一個重要概念,用於改善或改變圖像的形狀。在OpenCV中,形態學運算提供了一系列操作,包括開運算、閉運算、禮帽運算和黑帽運算。這些操作通常應用於二值圖像,用於去除噪聲、連接物體
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
你可能也想看
Google News 追蹤
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
使用 LBP(Local Binary Patterns) 進行紋理分析和瑕疵檢測 Local Binary Patterns(LBP) 是一種用來描述圖像紋理的特徵提取技術。LBP 對於檢測表面紋理的異常具有很好的效果,尤其在檢測紋理一致的材料表面(例如紡織品、紙張、金屬)時,LBP 非常有用。
Thumbnail
本篇文章主要講述cv2.connectedComponent應用於物件上的分割,將不同文字分割並用不同顏色標記。 範例程式結果圖 cv2.connectedComponentsWithStats 是 OpenCV 中用來執行連通元件標記的函式之一。
Thumbnail
伽瑪校正(Gamma correction)被視為影像增強的一種方法之一。 通過調整 gamma 值,可以改變圖像的亮度和對比度,從而使圖像更清晰或更具有視覺效果。 以下將利用cv2.LUT及numpy的組合實現伽瑪校正,及詳細介紹cv2.LUT 函式應用。
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
Thumbnail
繼上次分享的「【🔒 影像辨識 - 影像處理】Ep.1 關於影像的基本單位, 相信我們對於影像的儲存應該有了基本的認識了, 那麼接下來我們會需要的是了解顏色的組成。 我們除了在文章裡講述概念之外, 也會提供實作的數位作品分享給大家, 請大家根據範例學習與練習。 關於顏色 灰階的時代 早期尚未
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
使用 LBP(Local Binary Patterns) 進行紋理分析和瑕疵檢測 Local Binary Patterns(LBP) 是一種用來描述圖像紋理的特徵提取技術。LBP 對於檢測表面紋理的異常具有很好的效果,尤其在檢測紋理一致的材料表面(例如紡織品、紙張、金屬)時,LBP 非常有用。
Thumbnail
本篇文章主要講述cv2.connectedComponent應用於物件上的分割,將不同文字分割並用不同顏色標記。 範例程式結果圖 cv2.connectedComponentsWithStats 是 OpenCV 中用來執行連通元件標記的函式之一。
Thumbnail
伽瑪校正(Gamma correction)被視為影像增強的一種方法之一。 通過調整 gamma 值,可以改變圖像的亮度和對比度,從而使圖像更清晰或更具有視覺效果。 以下將利用cv2.LUT及numpy的組合實現伽瑪校正,及詳細介紹cv2.LUT 函式應用。
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
Thumbnail
繼上次分享的「【🔒 影像辨識 - 影像處理】Ep.1 關於影像的基本單位, 相信我們對於影像的儲存應該有了基本的認識了, 那麼接下來我們會需要的是了解顏色的組成。 我們除了在文章裡講述概念之外, 也會提供實作的數位作品分享給大家, 請大家根據範例學習與練習。 關於顏色 灰階的時代 早期尚未
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib