如何使用 OpenCV 库修复图像失真
2023-11-27 11:40:0 Author: www.4hou.com(查看原文) 阅读量:4 收藏

walker 技术 2023-11-27 11:40:00

44

收藏

高质量图像对于包括安全和车载摄像系统在内的各种解决方案以及开发和训练用于图像处理任务的机器学习算法至关重要。

然而,物理相机传感器经常会导致照片失真。这些扭曲会显着降低图像质量,甚至使您的解决方案无法处理图像。

在本文中,我们将探讨什么是图像失真以及消除它们的重要性。我们还展示了如何使用 OpenCV 修复图像失真。本文对于致力于具有图像处理功能的 IT 解决方案、想要了解有关修复图像失真的更多信息的企业和开发团队将有所帮助。

什么是图像失真?它们如何影响您的解决方案的性能?

图像失真通常是图形图像与其现实原型的不成比例、不充分的偏差。例如,现实生活中的直线或平行线可能会出现变形或不自然的弯曲。另一个例子是与照明相关的扭曲,例如当颜色朝图像边界变暗时,类似于渐晕。

并非所有的扭曲都是不利的。例如,您可能希望在使用广角镜头拍摄的图像中保留特定的畸变,以突出显示前景和背景之间的距离。

然而,通常情况下,您需要相机来拍摄精确的图像。对于某些技术来说,获得零失真的图像至关重要。

1701422944707.png

确保图像无失真对于开发机器学习(ML) 解决方案和训练人工智能(AI) 网络执行图像处理任务极其重要。

训练数据集必须一致(相似的示例必须具有相似的标记)且统一(所有属性的值必须在所有数据中具有可比性)。质量差的数据集会降低人工智能算法训练过程的效率。

在某些情况下,可以故意将扭曲的图像放置在数据集中。例如,您可能想要训练算法来处理由具有不同失真的不同相机拍摄的图像。然而,如果来自不同相机的图像在扭曲的形式和程度方面存在显着差异,那么将此类图像包含在一个数据集中将破坏一致性和均匀性要求。因此,不可能有效地训练人工智能算法来提供所需的结果。

图像质量对于使用计算机视觉和增强现实(AR) 技术的软件也至关重要。

假设您正在使用一个复杂的解决方案,该解决方案使用两个或更多相机从不同角度拍摄照片。您可能需要组合多个图像才能接收三维图像,就像车辆 360 度摄像头系统中使用的图像一样。或者您可能希望通过拼接多张照片来扩展视图,以生成整个场景的高分辨率全景图像。如果不校准(切除)相机传感器,连接图像之间的拼接将是可见的。

要解决这些问题,您需要修复图像失真。在讨论如何做到这一点之前,我们先简要探讨一下此类扭曲的常见类型。

图像失真的类型

为了有效地校正图像,首先必须了解您正在处理什么类型的失真。图像畸变有两种类型:径向畸变和切向畸变。

当光学传感器与光学透镜成角度放置时,会发生切向畸变。

image.png

以下是拍摄方形物体时切向畸变如何工作的示例:

image.png

径向畸变是指从图像中心到边缘的线条曲率,反之亦然。径向畸变分为三种类型:

1.当图像放大率随着距光轴的距离而减小时,就会出现桶形畸变。

2.当图像放大倍数随着距光轴的距离而增加时,就会出现枕形畸变。

3.小胡子失真(也称为波形失真)比前两种类型发生的情况要少得多,并且本质上是它们的混合。胡须畸变开始时是靠近图像中心的桶形畸变,并逐渐变成朝向图像外围的枕形畸变。

径向畸变的类型取决于镜头的类型和形状——镜头越弯曲,最终图像中的线条越弯曲。让我们比较一下输入网格在没有失真的情况下与使用导致不同类型径向失真的镜头拍摄时的样子:

image.png

考虑到这一点,我们来讨论如何消除图像失真。

如何修复图像扭曲

一些现代相机具有先进的镜头系统,旨在最大限度地减少最终图像的失真;然而,他们无法完全消除它们。不太先进的相机可以提供有关需要进行哪些更改才能消除失真的信息。

而通常用于开发定制设备的最简单的相机则不具备这些功能。要修复失真,您首先需要根据传感器的实际实验确定必要的更改。

简单的传感器很普遍,因为它们批量生产的成本低廉。即使一个传感器的设计存在微小差异,也会显着提高整批传感器的价格。

如果您的相机镜头产生图像失真该怎么办?

拍摄图像后,您可以使用编程方法修复失真。这样,您可以为特定相机创建算法,并使用该算法自动修复该相机拍摄的所有图像的扭曲。

要创建可以检测和修复图像失真的算法,您可以使用以下工具:

· 开放CV。一个开源计算机视觉和机器学习软件库,拥有 2,500 多种优化算法。您可以使用这些算法来拼接图像、检测和识别人脸、识别物体、跟踪移动物体、提取物体的 3D 模型等。OpenCV 库为计算机视觉解决方案提供了通用基础设施,有助于加速机器感知在商业中的使用产品。

· 四月标签。一种视觉基准系统,可用于不同的任务,包括增强现实、机器人和相机校准。AprilTag 库旨在轻松包含在其他应用程序中,以及移植到嵌入式设备。

· 计算机视觉工具箱。商业工具集,提供用于设计和测试计算机视觉、3D 视觉和视频处理系统的算法、函数和应用程序。它还允许您自动执行单镜头、立体和鱼眼相机的校准工作流程。

· ShiftN。自动镜头畸变校正软件特别适用于建筑图像。首先,ShiftN 搜索图像中的直线和边缘,并考虑那些足够垂直的可能的建筑元素。然后,软件运行一个优化过程,尝试确定透视,校正图像,使线条平行。

在本文中,我们展示了一个使用 OpenCV 确定和修复图像失真的实际示例,因为该库具有丰富的图像处理功能并且可以免费使用。此外,我们在这方面拥有丰富的经验。

如何使用 OpenCV 库识别和修复图像失真

OpenCV 是修复图像失真的好工具。该库提供了校正图像和校准相机传感器的广泛功能。它支持各种相机型号,并涵盖寻找畸变系数和修复畸变的不同方法。但首先,您需要知道如何使用 OpenCV 识别图像失真。

默认情况下,OpenCV 使用针孔相机模型。校准方法确定用于校准的模型以及将在模型上使用的标记。相机模型决定了计算相机矩阵的算法以及要使用的畸变系数的数量。让我们定义这些术语:

· 相机矩阵是将点从三维场景映射到二维图像的数学模型,在使用畸变系数修复相机畸变时使用。

· 畸变系数描述图像中的某些畸变。失真越复杂,描述和消除它们所需的系数就越多。OpenCV 可以计算最多六个径向失真系数和最多两个切向失真系数。

现在,让我们尝试确定使用 OpenCV 针对特定传感器检测和消除图像失真所需的系数。

image.png

1. 生成相机标定模型

用于相机校准的模型(也称为板)分为三种类型:

1.Chessboard

2.ArUco board

3.ChArUco board, which combines Chessboard and ArUco

它们是这样的:

image.png

对于我们的示例,我们使用 ChArUco 板,因为与标记角相比,它的角要准确得多。

要在 OpenCV 中生成 ChArUco 板,请使用以下代码:

image.png

结果,您将收到以下模型:

image.png

2. 打印出实体模型并拍几张照片

您使用要校准的相机传感器拍摄的照片越多,并且板在不同图像中的放置越多样化,您能够计算的系数就越准确。

假设您收到以下图像并发现您的传感器导致径向失真:

image.png

接下来,将接收到的图像上传到cv::Mat inImag变量。

3. 检测图像中的ArUco标记

要检测 ArUco 标记,请对每个图像使用以下代码:

image.png

结果,ArUco 标记的角点坐标和标记的 ID 将记录在corners和ids变量中。以下是找到的标记在图像中的样子:

image.png

4. 检测图像中的 ChArUco 标记

使用检测到的 ArUco 标记来查找 ChArUco 标记,代码如下:

image.png

检测到的 ChArUco 标记如下所示:

image.png

正如您所看到的,ChArUco 标记位于 ArUco 标记之间的角落(这就是我们需要首先找到 ArUco 标记的原因)。

5. 校准相机以确定畸变系数并构建相机矩阵

找到 ChArUco 标记的边缘和 ID 后,您就可以开始校准相机:

repError = aruco::calibrateCameraCharuco(allCharucoCorners, allCharucoIds, charucoboard, imgSize, cameraMatrix, distCoeffs, rvecs, tvecs, calibrationFlags);

运行上面的代码后,您将得到:

· 填充后的图像矩阵 ( cameraMatrix)

· 畸变系数 ( distCoeffs)

· 旋转向量 ( rvecs)

· 平移向量 ( tvecs)

现在您知道了失真系数,您可以开始使图像不失真。

6.修复变形

要修复 OpenCV 中的径向畸变,您只需要图像矩阵和畸变系数:

image.png

不失真inputImage函数使用校准期间找到的系数 (cameraMatrix和)来修复图像失真 ( ) distCoeffs。最终图像记录在outputImage中。

与上面提到的所有其他函数一样,非扭曲函数默认使用针孔相机模型。对于其他相机模型,OpenCV 具有类似的功能,用于识别图像中的标记、校正图像和消除失真。当使用其他相机型号时,包含失真系数的矩阵的数量和格式可能会有所不同。因此,您不应该同时使用不同相机型号的函数,因为这会导致 OpenCV 运行出现错误。

对于使用已校准的传感器拍摄的所有图像,您检测到的畸变系数将是正确的,而不仅仅是用于校准的那些图像。这使您可以校准相机一次,然后使用为之后拍摄的所有图像确定的系数。

以下是修复图像失真之前和之后图像的示例:

image.png

如果您正在处理特别复杂的图像扭曲,您可能需要尝试另一种更准确的方法来查找图像上的 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 适合大多数情况,并且允许您显着改善图像的几何形状和质量,而无需使用复杂的镜头和传感器。

本文翻译自:https://www.apriorit.com/dev-blog/ai-fix-image-distortions-using-opencv如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/XXOl
如有侵权请联系:admin#unsafe.sh