一、概述
圖像失真是指由於光學元件的製造或擺放方式以及攝像機的成像方式等原因,在圖像獲取和處理過程中所引入的形變或畸變。常見的圖像失真類型有徑向失真和切向失真。針對圖像的失真,在 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-tw/n/362702.html