[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),使用變換矩陣進行仿射變換的計算就是將這個點的坐標應用於變換矩陣的線性運算


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
















113會員
172Content count
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_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形式表示。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
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
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
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
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
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 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。