圖像失真矯正——cv2.undistort詳解

一、概述

圖像失真是指由於光學元件的製造或擺放方式以及攝像機的成像方式等原因,在圖像獲取和處理過程中所引入的形變或畸變。常見的圖像失真類型有徑向失真和切向失真。針對圖像的失真,在 OpenCV 中提供了一系列的 API 進行消除,其中最常用的方法就是 cv2.undistort。本文將詳細介紹 cv2.undistort 的使用方法和相關細節。

二、函數介紹

cv2.undistort 函數用於消除圖像失真,並返回矯正後的圖像。函數的定義如下:

cv2.undistort(src, cameraMatrix, distCoeffs, dst=None, newCameraMatrix=None)

1. 參數說明

  • src: 輸入圖像
  • cameraMatrix: 相機內參矩陣,包括焦距等參數
  • distCoeffs: 相機畸變係數,包括徑向畸變和切向畸變等
  • dst: 輸出矯正後的圖像,和原圖像大小相同
  • newCameraMatrix: 新的相機內參矩陣,可以為空。如果不為空,表示要調整輸出圖像的焦距和中心點(裁剪圖像將丟失圖像的部分)

2. 返回值說明

如果 dst 不為空,則返回矯正後的圖像。如果 dst 為空,則返回新的相機內參矩陣。

三、使用方法

1. 相機內參矩陣和相機畸變係數

相機內參矩陣和相機畸變係數是矯正圖像的重要參數。可以通過相機標定得到。相機標定的流程和相關知識不在本文介紹範圍內,如果需要了解可以參考其他相關教程。

相機內參矩陣是一個 3×3 的矩陣,包括焦距 fx 和 fy,以及圖像中心點的坐標 cx 和 cy。可以用來將像素坐標轉化為相機坐標,即像素坐標到歸一化平面坐標的映射。相機畸變係數則是用來表示畸變形狀和強度的參數,包括五個或八個參數,其中五個參數表示徑向畸變,另外三個參數表示切向畸變。這些參數也可以通過相機標定得到。

2. 矯正圖像

接下來,我們介紹如何使用上述參數來矯正圖像。

首先,我們需要加載一張含有失真的圖像,並讀取相機內參矩陣和相機畸變係數,代碼如下:

import cv2

# 讀取含有失真的圖像
img = cv2.imread("image.jpg")

# 讀取相機內參矩陣和相機畸變係數
cameraMatrix = np.array([[2520., 0., 1260.], [0., 2520., 960.], [0., 0., 1.]])
distCoeffs = np.array([[-0.4, 0.2, 0., 0., 0.]])

然後,我們使用 cv2.undistort 函數進行矯正,代碼如下:

# 進行矯正
dst = cv2.undistort(img, cameraMatrix, distCoeffs)

最後,我們可以將矯正前後的圖像進行對比,代碼如下:

# 顯示原圖和矯正後的圖像
cv2.imshow("Original Image", img)
cv2.imshow("Undistorted Image", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 調整輸出圖像

通過 cv2.undistort 函數可以對圖像進行矯正,並輸出矯正後的圖像。可以選擇調整輸出圖像的焦距和中心點,以達到不裁剪圖像的效果。

假設我們需要將原圖像的焦距調整為 fx = 1000,fy = 1000,中心點調整為 cx = 600,cy = 400,代碼如下:

# 調整輸出圖像的焦距和中心點
newCameraMatrix = np.array([[1000., 0., 600.], [0., 1000., 400.], [0., 0., 1.]])
dst1 = cv2.undistort(img, cameraMatrix, distCoeffs, None, newCameraMatrix)

# 顯示原圖和矯正後的圖像
cv2.imshow("Original Image", img)
cv2.imshow("Adjusted Undistorted Image", dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、總結

本文介紹了 OpenCV 中消除圖像失真的常用函數 cv2.undistort 的使用方法和參數細節,包括相機內參矩陣、相機畸變係數、矯正後的圖像以及調整輸出圖像等。在圖像處理中,使用 cv2.undistort 函數可以有效提高圖像的質量和準確度。

原創文章,作者:IOHFF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/362702.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IOHFF的頭像IOHFF
上一篇 2025-02-27 19:28
下一篇 2025-02-27 19:28

相關推薦

  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python圖像黑白反轉用法介紹

    本文將從多個方面詳細闡述Python圖像黑白反轉的方法和技巧。 一、Pillow模塊介紹 Pillow是Python的一個圖像處理模塊,可以進行圖片的裁剪、旋轉、縮放等操作。使用P…

    編程 2025-04-28
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • Python實現圖像轉化為灰度圖像

    本文將從多個方面詳細闡述如何使用Python將圖像轉化為灰度圖像,包括圖像的概念、灰度圖像的概念、Python庫的使用以及完整的Python代碼實現。 一、圖像與灰度圖像 圖像是指…

    編程 2025-04-28
  • 圖像與信號處理期刊級別

    本文將從多個方面介紹圖像與信號處理期刊級別的相關知識,包括圖像壓縮、人臉識別、關鍵點匹配等等。 一、圖像壓縮 圖像在傳輸和存儲中佔據了大量的空間,因此圖像壓縮成為了很重要的技術。常…

    編程 2025-04-28
  • Python 文件內圖像重命名

    Python作為一門功能強大的編程語言,可以實現很多實用的操作。在基本編程操作中,經常會遇到需要對文件進行操作,而文件中的圖像也需要進行重命名。本文將從多個方面詳細介紹如何使用Py…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25

發表回復

登錄後才能評論