前段时间我入职了一家公司担任图像处理算法工程师。然而因为意外收到了研究生录取通知需要回家准备材料。我在实习期还没结束时就溜了,草草结束了这段为期一个半月的图像处理算法工程师生涯。
在这短暂的工作时间里,我初步入门了经典2D数字图像处理,对3维点云数据处理也有了一部分了解,下面我会分两部分介绍我的学习经验,既为大家进入这个领域做参考也为我的学习做个记录。
2D数字图像处理
经典2D数字图像处理是一个非常成熟的领域,早在20年前德国公司MVTec便推出了数字图像处理软件HELCON,直到现在它也是商业数字图像处理软件中的佼佼者。在开源领域也有非常成熟的算法库OpenCV供我们学习使用。
我的2D数字图像处理是从学习冈萨雷斯写著的《数字图像处理》开始的。这本书涵盖了数字图像处理的大部分处理方法,对于每个方法也给出了几个经典算法作为示例。
在这部分,我主要学习了一下内容:灰度变换与空间滤波,直方图处理,滤波器,彩色图像处理(RGB,HSV),形态学图像处理(腐蚀,膨胀等),图像分割,特征提取。
在这部分的学习过程中,我使用cpp实现了十数种经典图像处理方法,包括图像旋转缩放,canny边缘检测,高斯滤波,Sobel滤波核,OTSU大津法,Harn's角点检测,灰度共生矩阵等。通过自己实现这些经典方法,我对图像处理方法的细节有了深入的理解。例如访问图像像素的方法,光opencv就提供了三种以上的方法,各有优劣。还有图像边缘如何滤波等。同时,在处理图像旋转时我发现算法的时间消耗很高,这自然而然引出了算法优化加速的进阶内容。
使用Intel指令集来加速算法
Intel指令集的使用在我之前的文章中有专门讲述:https://blog.csdn.net/m0_46544629/article/details/138392014?spm=1001.2014.3001.5502
Intel指令集的使用有时非常需要技巧性和熟练度,例如对于这个问题:使用Intel指令集的方法加速将RGB彩色图像进行像素翻转的算法,初学者很难依靠自己的冥思苦想得出很好的处理方法,而这个方法具有很高的技巧性,需要对这类方法指令集方法有一定积累才能思考出来。
在2D图像处理算法中,为了加速算法,时常会用到Intel指令集来加速,因此这部分的学习也是必要的。
3维点云图像处理
这部分的学习是有关时下比较热门的领域:三维点云空间物体识别的。三维点云数据是对三维物体进行采样后得到的数据,它通过在三维空间中分布在物体表面上的小点来揭示物体在三维空间中的位置与形态,通过对点云数据进行处理,我们可以模拟、识别出物体在三维空间中的真实面貌。
三维点云数据处理的一个入门问题是:如何识别并匹配三维空间中的物体。这就是我学习的第一个方法:【6D位姿估计】Point Pair Feature (PPF)。它通过将三维空间中的点组合为点对,每个点对有3个参数,通过匹配点对参数来完成物体的识别和匹配。这个方法也是三维点云数据处理领域的一个经典方法。我学习过程中参考的代码是opencv中的surfacematch代码。
我学习的第二个方法是:三维空间中的相机标定。这是用于确定三维空间中的观察者(相机)所处位置的方法。我学习过程中参考的方法有张正友标定法和沙姆标定法,参考的代码依然是opencv中的calibration相关的代码。
为了完全看懂opencv中的代码,我还学习了许多内容,包括
奇异值分解(SVD):这是用于对点云数据进行主成分分析的数据处理方法。
罗得里格斯旋转公式(Rodrigues' rotation formula):这是用于数学实现三维空间中向量旋转的方法。
总结
总得来说,数字图像处理是一个很有意思的领域,现如今不断有新方法出现,特别是机器学习的加入给这个领域带来了新的生机与活力。三维空间中的物体识别也是当下比较热门的领域,未来也大有可为,例如SLAM就是当下研究的热门,无人驾驶、机器人导航都需要这方面的研究突破。