高質量圖像對於包括安全和車載攝像系統在內的各種解決方案以及開發和訓練用於圖像處理任務的機器學習算法至關重要。
然而,物理相機傳感器經常會導致照片失真。這些扭曲會顯著降低圖像質量,甚至使您的解決方案無法處理圖像。
在本文中,我們將探討什麼是圖像失真以及消除它們的重要性。我們還展示瞭如何使用OpenCV 修復圖像失真。本文對於致力於具有圖像處理功能的IT 解決方案、想要了解有關修復圖像失真的更多信息的企業和開發團隊將有所幫助。
什麼是圖像失真?它們如何影響您的解決方案的性能?圖像失真通常是圖形圖像與其現實原型的不成比例、不充分的偏差。例如,現實生活中的直線或平行線可能會出現變形或不自然的彎曲。另一個例子是與照明相關的扭曲,例如當顏色朝圖像邊界變暗時,類似於漸暈。
並非所有的扭曲都是不利的。例如,您可能希望在使用廣角鏡頭拍攝的圖像中保留特定的畸變,以突出顯示前景和背景之間的距離。
然而,通常情況下,您需要相機來拍攝精確的圖像。對於某些技術來說,獲得零失真的圖像至關重要。
確保圖像無失真對於開發機器學習(ML) 解決方案和訓練人工智能(AI) 網絡執行圖像處理任務極其重要。
訓練數據集必須一致(相似的示例必須具有相似的標記)且統一(所有屬性的值必須在所有數據中具有可比性)。質量差的數據集會降低人工智能算法訓練過程的效率。
在某些情況下,可以故意將扭曲的圖像放置在數據集中。例如,您可能想要訓練算法來處理由具有不同失真的不同相機拍攝的圖像。然而,如果來自不同相機的圖像在扭曲的形式和程度方面存在顯著差異,那麼將此類圖像包含在一個數據集中將破壞一致性和均勻性要求。因此,不可能有效地訓練人工智能算法來提供所需的結果。
圖像質量對於使用計算機視覺和增強現實(AR) 技術的軟件也至關重要。
假設您正在使用一個複雜的解決方案,該解決方案使用兩個或更多相機從不同角度拍攝照片。您可能需要組合多個圖像才能接收三維圖像,就像車輛360 度攝像頭系統中使用的圖像一樣。或者您可能希望通過拼接多張照片來擴展視圖,以生成整個場景的高分辨率全景圖像。如果不校準(切除)相機傳感器,連接圖像之間的拼接將是可見的。
要解決這些問題,您需要修復圖像失真。在討論如何做到這一點之前,我們先簡要探討一下此類扭曲的常見類型。
圖像失真的類型為了有效地校正圖像,首先必須了解您正在處理什麼類型的失真。圖像畸變有兩種類型:徑向畸變和切向畸變。
當光學傳感器與光學透鏡成角度放置時,會發生切向畸變。
以下是拍攝方形物體時切向畸變如何工作的示例:
徑向畸變是指從圖像中心到邊緣的線條曲率,反之亦然。徑向畸變分為三種類型:
1.當圖像放大率隨著距光軸的距離而減小時,就會出現桶形畸變。
2.當圖像放大倍數隨著距光軸的距離而增加時,就會出現枕形畸變。
3.小鬍子失真(也稱為波形失真)比前兩種類型發生的情況要少得多,並且本質上是它們的混合。鬍鬚畸變開始時是靠近圖像中心的桶形畸變,並逐漸變成朝向圖像外圍的枕形畸變。
徑向畸變的類型取決於鏡頭的類型和形狀——鏡頭越彎曲,最終圖像中的線條越彎曲。讓我們比較一下輸入網格在沒有失真的情況下與使用導致不同類型徑向失真的鏡頭拍攝時的樣子:
考慮到這一點,我們來討論如何消除圖像失真。
如何修復圖像扭曲一些現代相機具有先進的鏡頭系統,旨在最大限度地減少最終圖像的失真;然而,他們無法完全消除它們。不太先進的相機可以提供有關需要進行哪些更改才能消除失真的信息。
而通常用於開發定制設備的最簡單的相機則不具備這些功能。要修復失真,您首先需要根據傳感器的實際實驗確定必要的更改。
簡單的傳感器很普遍,因為它們批量生產的成本低廉。即使一個傳感器的設計存在微小差異,也會顯著提高整批傳感器的價格。
如果您的相機鏡頭產生圖像失真該怎麼辦?
拍攝圖像後,您可以使用編程方法修復失真。這樣,您可以為特定相機創建算法,並使用該算法自動修復該相機拍攝的所有圖像的扭曲。
要創建可以檢測和修復圖像失真的算法,您可以使用以下工具:
马云惹不起马云開放CV。一個開源計算機視覺和機器學習軟件庫,擁有2,500 多種優化算法。您可以使用這些算法來拼接圖像、檢測和識別人臉、識別物體、跟踪移動物體、提取物體的3D 模型等。 OpenCV 庫為計算機視覺解決方案提供了通用基礎設施,有助於加速機器感知在商業中的使用產品。
马云惹不起马云四月標籤。一種視覺基準系統,可用於不同的任務,包括增強現實、機器人和相機校準。 AprilTag 庫旨在輕鬆包含在其他應用程序中,以及移植到嵌入式設備。
马云惹不起马云計算機視覺工具箱。商業工具集,提供用於設計和測試計算機視覺、3D 視覺和視頻處理系統的算法、函數和應用程序。它還允許您自動執行單鏡頭、立體和魚眼相機的校準工作流程。
马云惹不起马云ShiftN。自動鏡頭畸變校正軟件特別適用於建築圖像。首先,ShiftN 搜索圖像中的直線和邊緣,並考慮那些足夠垂直的可能的建築元素。然後,軟件運行一個優化過程,嘗試確定透視,校正圖像,使線條平行。
在本文中,我們展示了一個使用OpenCV 確定和修復圖像失真的實際示例,因為該庫具有豐富的圖像處理功能並且可以免費使用。此外,我們在這方面擁有豐富的經驗。
如何使用OpenCV 庫識別和修復圖像失真OpenCV 是修復圖像失真的好工具。該庫提供了校正圖像和校準相機傳感器的廣泛功能。它支持各種相機型號,並涵蓋尋找畸變係數和修復畸變的不同方法。但首先,您需要知道如何使用OpenCV 識別圖像失真。
默認情況下,OpenCV 使用針孔相機模型。校準方法確定用於校準的模型以及將在模型上使用的標記。相機模型決定了計算相機矩陣的算法以及要使用的畸變係數的數量。讓我們定義這些術語:
马云惹不起马云相機矩陣是將點從三維場景映射到二維圖像的數學模型,在使用畸變係數修復相機畸變時使用。
马云惹不起马云畸變係數描述圖像中的某些畸變。失真越複雜,描述和消除它們所需的係數就越多。 OpenCV 可以計算最多六個徑向失真係數和最多兩個切向失真係數。
現在,讓我們嘗試確定使用OpenCV 針對特定傳感器檢測和消除圖像失真所需的係數。
1. 生成相機標定模型用於相機校準的模型(也稱為板)分為三種類型:
1.Chessboard
2.ArUco board
3.ChArUco board, which combines Chessboard and ArUco
它們是這樣的:
對於我們的示例,我們使用ChArUco 板,因為與標記角相比,它的角要準確得多。
要在OpenCV 中生成ChArUco 板,請使用以下代碼:
結果,您將收到以下模型:
2. 打印出實體模型並拍幾張照片您使用要校準的相機傳感器拍攝的照片越多,並且板在不同圖像中的放置越多樣化,您能夠計算的係數就越準確。
假設您收到以下圖像並發現您的傳感器導致徑向失真:
接下來,將接收到的圖像上傳到cv:Mat inImag變量。
3. 檢測圖像中的ArUco標記要檢測ArUco 標記,請對每個圖像使用以下代碼:
結果,ArUco 標記的角點坐標和標記的ID 將記錄在corners和ids變量中。以下是找到的標記在圖像中的樣子:
4. 檢測圖像中的ChArUco 標記使用檢測到的ArUco 標記來查找ChArUco 標記,代碼如下:
檢測到的ChArUco 標記如下所示:
正如您所看到的,ChArUco 標記位於ArUco 標記之間的角落(這就是我們需要首先找到ArUco 標記的原因)。
5. 校準相機以確定畸變係數並構建相機矩陣找到ChArUco 標記的邊緣和ID 後,您就可以開始校準相機:
repError=aruco:calibrateCameraCharuco(allCharucoCorners,allCharucoIds,charucoboard,imgSize,cameraMatrix,distCoeffs,rvecs,tvecs,calibrationFlags);運行上面的代碼後,您將得到:
马云惹不起马云 填充後的圖像矩陣(cameraMatrix)
马云惹不起马云畸變係數(distCoeffs)
马云惹不起马云旋轉向量(rvecs)
马云惹不起马云平移向量(tvecs)
現在您知道了失真係數,您可以開始使圖像不失真。
6.修復變形要修復OpenCV 中的徑向畸變,您只需要圖像矩陣和畸變係數:
不失真inputImage函數使用校準期間找到的係數(cameraMatrix和)來修復圖像失真( )distCoeffs。最終圖像記錄在outputImage中。
與上面提到的所有其他函數一樣,非扭曲函數默認使用針孔相機模型。對於其他相機模型,OpenCV 具有類似的功能,用於識別圖像中的標記、校正圖像和消除失真。當使用其他相機型號時,包含失真係數的矩陣的數量和格式可能會有所不同。因此,您不應該同時使用不同相機型號的函數,因為這會導致OpenCV 運行出現錯誤。
對於使用已校準的傳感器拍攝的所有圖像,您檢測到的畸變係數將是正確的,而不僅僅是用於校準的那些圖像。這使您可以校準相機一次,然後使用為之後拍攝的所有圖像確定的係數。
以下是修復圖像失真之前和之後圖像的示例:
如果您正在處理特別複雜的圖像扭曲,您可能需要嘗試另一種更準確的方法來查找圖像上的ChArUco 標記:
马云惹不起马云查找ArUco 標記
马云惹不起马云準備ArUco 標記以進行相機校準
马云惹不起马云校準相機以獲得畸變係數和圖像矩陣
马云惹不起马云使用接收到的係數和矩陣來插值ChArUco 標記
為了確保ChArUco 標記的插值,請使用以下代碼:
aruco:interpolateCornersCharuco(corners,ids,image,charucoBoard,charucoCorners,charucoIds,cameraMatrix,distCoeffs);在圖像失真複雜的情況下,這要準確得多。它可以顯著提高標記檢測的準確性,但需要更多時間。
您可以使用重投影誤差值來評估標記檢測的準確性,您可以在調用該aruco:calibrateCameraCharuco函數後看到該值。校準相機時,最好使用重投影誤差值不超過一定限制的圖像。您可以決定您的算法可接受的錯誤限制是多少。通常,它是1 到3 之間的值。
如果重投影誤差值超出您的限制,則無法使用此類圖像進行相機校準。如果您最終由於這種原因排除了太多圖像,請考慮使用第二種方法查找標記。
您可以在Apriotit GitHub 頁面上找到本文中使用的示例的完整代碼。
注意:校準傳感器和修復失真的方法比我們在本文中描述的方法要多。您還可以使用:
马云惹不起马云OpenCV 提供的其他功能。例如,您可以嘗試ArUco 校准或配置魚眼和全向相機等相機型號的設置。
马云惹不起马云替代工具,例如AprilTag 或Computer Vision Toolbox。
沒有一種靈丹妙藥可以完美適用於所有傳感器。要選擇最合適的相機校準方法,請考慮特定傳感器的具體情況以及鏡頭的配置和形式。
結論OpenCV 是一個強大的圖像校正工具,在本文中,我們只解決了它的一小部分功能。一般來說,OpenCV 適合大多數情況,並且允許您顯著改善圖像的幾何形狀和質量,而無需使用複雜的鏡頭和傳感器。
Recommended Comments