【CUDA学习笔记】第十篇:基本计算机视觉操作【下】(附实践源码下载)

点击上方AI人工智能初学者 ,订阅我!此刻开始我们一起学习进步!

目录

1、高通滤波器

1.1、Sobel滤波器

1.2、Scharr滤波器

1.3、拉普拉斯滤波器

2、图像形态学操作

3、总结上下部分

1、高通滤波器

    高通滤波器可去除图像中的低频成分并增强高频成分,因此当高通滤波器应用于图像时,将可去除属于低频范围的背景并增强属于高频成分的边缘,因此高通滤波器也称为边缘检测器。滤波器的系数需要改变,否则就会与上一节中的滤波器相类似。目前有许多高通滤波器可供选择,如下所示:


    Sobel滤波器


    Scharr滤波器


    Laplacian滤波器

1.1、Sobel滤波器

picture.image

    Sobel算子或Sobel滤波器是一种广泛用于边缘检测应用的图像处理和计算机视觉算法,是一个3×3滤波器,近似于图像强度的梯度函数,针对水平和竖直方向的梯度提供各自独立的滤波器来计算,使用与本章前面所述相类似的图像卷积方法。水平和竖直3×3 Sobel滤波器如下:

picture.image

实现这个Sobel滤波器的代码如下:

picture.image

    OpenCV提供了用于实现Sobel滤波器的createSobelFilter函数,它需要很多参数:前两个参数是源图像和目标图像的数据类型;第三、四个参数分别是x和y导数的阶(order),给定1和0去计算x导数或竖直边缘,并给定0和1去计算y导数或水平边缘;第五个参数是可选参数,表示内核的大小,默认值为3;还有个可选参数,作为导数的规模。


    为了同时看到水平和竖直边缘,将x导数和y导数的结果相加,结果如图:

picture.image

picture.image

picture.image

picture.image

    以上结果分别是原始图像、Sobel-x导数、Sobel-y导数和Sobel-xy导数输出结果。


    Sobel算子提供的导数近似值虽然并不准确,但在计算机视觉应用中的边缘检测中依旧非常有用,它缺乏旋转对称性。为了克服这个问题,就需要Scharr算子的辅助。

1.2、Scharr滤波器

picture.image

    由于Sobel不提供旋转对称性,因此使用Scharr算子通过不同的滤波器掩码来克服此问题,如下所示:

picture.image

    从上面的掩码中可以看出,Scharr算子对中心行或中心列赋予更多权重以查找边缘,实现Scharr滤波器的程序如下:

picture.image

 OpenCV提供了用于实现Scharr滤波器的createScharrFilter函数,它需要很多参数:前两个参数是源图像和目标图像的数据类型,第三、四个参数分别是x和y导数阶,给定1,0去计算x导数或竖直边缘,并给定0,1去计算y导数或水平边缘;第五个参数是可选项,表示内核的大小,默认值为3。


    为了同时看到水平和竖直边缘,将x导数和y导数的结果相加,结果如图:

picture.image

picture.image

picture.image

picture.image

以上结果分别是原始图像、Scharr-x导数、Scharr-y导数和Scharr-xy导数输出结果。

1.3、拉普拉斯滤波器

picture.image

    拉普拉斯滤波器也是一种用于找出图像边缘的微分算子,区别于Sobel和Scharr的一阶微分算子,拉普拉斯是一种二阶微分算子,可以同时在水平和竖直方向上找到边缘,这与Sobel和Scharr算子不同。拉普拉斯滤波器计算二阶导数,对图像中的噪声是非常敏感的,因此在使用拉普拉斯滤波器之前最好对图像进行模糊处理并去除噪声。实现拉普拉斯滤波器的代码如下:

picture.image

    通过createLaplacianFilter函数,生成内核大小为1和3的两种拉普拉斯滤波器来处理图像,除了内核的大小之外,该函数还需要源图像和目标图像的数据类型作为参数。使用apply方法来创建拉普拉斯滤波器,并应用于图像处理。拉普拉斯滤波器的输出如图:

picture.image

picture.image

picture.image

    总结本部分,描述了不同的高通滤波器,包括Sobel、Scharr和Laplacian三种滤波器。

其中Sobel和Scharr用一阶微分算子去计算边缘,对噪声不太敏感;

拉普拉斯算子是用二阶导数算子去计算边缘的,对噪声则是非常敏感的。

2、图像形态学操作

    图像形态学与图像的区域和形状有关,用来提取有助于表示形状和区域的图像组件。与前面看到的其他图像处理操作不同,图像形态学将图像视为一堆集合的总和。图像与一种称为结构元素的小模板交互作用,这种小模板定义图像形态学中的感兴趣区域或邻域。这里将逐一解释各种可执行在图像上的形态学操作:

侵蚀: 侵蚀将中心像素设置为邻域中所有像素的最小值,邻域由结构元素所定义,结构元素是1和0所组成的矩阵。侵蚀用于扩大物体中的孔、缩小边界、消除孤岛区块,并消除可能存在于图像边界上的狭窄半岛。

膨胀: 膨胀将中心像素设置为邻域中所有像素的最大值,膨胀增大了白色块的尺寸并减小了黑色区域的尺寸。它用于填充对象中的孔并扩展对象的边界。

开运算: 图像开运算基本上是侵蚀和膨胀的组合,图像开口被定义为先侵蚀,然后膨胀。两个操作都使用相同的结构元素执行,用于平滑图像的轮廓、分解窄桥并隔离彼此接触的物体。它用于分析发动机油中的磨损颗粒、再生纸中的油墨颗粒等。

闭运算: 图像闭运算定义为先膨胀,然后侵蚀。两个操作都使用相同的结构元素执行,用于融合狭窄的断裂并消除小孔。

    通过应用于仅包含黑色和白色的二值图像,有助于理解形态算子。OpenCV和CUDA提供了一个简单的API,可以对图像进行形态转换,代码如下:

picture.image

    需要首先创建定义形态操作的邻域的结构元素,这可以通过在OpenCV中使用get-StructuringElement函数来完成。需要提供结构元素的形状和大小作为此函数的参数,本代码中定义5×5大小的矩形结构元素。








    使用createMorphologyFilter函数创建形态学操作的滤波器,需要三个强制性参数:第一个参数定义要执行的操作——cv::MORPH\_ERODE用于侵蚀、cv::MORPH\_DILATE用于膨胀、cv::MORPH\_OPEN用于开运算、cv::MORPH\_CLOSE用于闭运算;第二个参数是图像的数据类型;第三个参数是先前创建的结构元素。用apply方法在图像上调用这些滤波器。








    图像上的形态学操作输出如图:

picture.image

picture.image

picture.image

picture.image

picture.image

    从输出可以看出,侵蚀减少了物体的边界,而膨胀使其变厚。我们认为白色部分是对象而黑色部分是背景。开运算可以平滑图像的轮廓,闭运算消除图像中的小孔。


    总而言之,形态学操作对于找出用于定义图像的形状和区域的组件是重要的,它可用于填充图像中的孔并使图像的轮廓平滑。

3、总结上下部分

    访问图像中特定位置的像素强度的方法,当我们对图像执行逐点运算时,它非常有用。直方图是用于描述图像的非常重要的全局特征,计算直方图的方法和直方图均衡化提高了图像的视觉质量。


    图像滤波是一种有用的邻域处理技术,用于消除噪声、提取图像的边缘特征,并进行了详细描述。


    低通滤波器用于消除噪声,但它也会模糊图像的边缘;


    高通滤波器去除被视为低频区域的背景,同时增强被视为高频区域的边缘。


    不同的形态学操作,如侵蚀,膨胀,开运算和闭运算,可用于描述图像的形状和填充图像中的孔。

关注【AI人工智能初学者 】并回复【cuda9 】即可获取本文的完整源码,只希望可以帮到你,当然,大佬除外啦~~~~

希望您可以关注公众号,也非常期待您的打赏。

声明:转载请说明出处

下方为小生公众号,还望包容接纳和关注,非常期待与您的美好相遇,让我们以梦为马,砥砺前行。

希望技术与灵魂可以一路同行

长按识别二维码关注一下

更多精彩内容可回复关键词

每篇文章的主题即可

picture.image

picture.image

点“在看”给我一朵小黄花picture.image

picture.image

0
0
0
0
评论
未登录
暂无评论