大家好,
希望大家都好,在前面的博客中,我们已经开始学习OpenCV的基础知识。在那里,我们已经看到了如何执行图像和视频大小调整、裁剪等操作,这是OpenCV教程的第二部分。在这篇博客中,我们主要关注OpenCV的高级部分,它将涵盖以下问题。但是如果你是OpenCV的新手,或者觉得这很难理解,那么请访问OpenCV基本指南第1部分的博客,并温习一下基础知识,然后再回到这个博客。OpenCV basic guide part-1
至今仍在我们脑海中挥之不去的问题是:
☞如何在图像中进行边缘检测?
☞如何在图像中进行轮廓检测?
☞如何在图像中实现色彩间隔?
☞如何处理颜色通道?
☞如何模糊图像?
☞如何使用BITWISE运算符?
☞如何绘制图像每个像素的颜色直方图?
让我们从比特深度的所有问题开始。
1)如何对图像进行边缘检测?
1.1.精明:
对于这里的边缘检测,我们将使用cv.Canny方法。输入图像为原始图像,保留-1,即像素值低于150为非边缘,阈值为-2,即像素值大于175为有效边缘。如果该值在150和175之间,则如果边缘像素与有效边缘相连,则仅将其视为有效边缘。
上述代码的输出:
原图:
原始图像的边缘:
现在我们将尝试通过使其模糊来找到原始图像的边缘。如何使图像模糊在博客中有进一步的介绍。
通过比较原始图像和模糊图像的边缘检测。我们知道图像中的边缘检测随着图像变得越来越模糊而减少。
1.2.拉普拉斯式:
在拉普拉斯边缘检测方法中,我们将计算源图像(x,y)像素的第二梯度。当ksize>1时,检查下面提到的源镜像的拉普拉斯公式:
当ksize=1时,通过使用以下3×3光圈对图像进行滤波来计算拉普拉斯系数:
其中ksize:用于计算二阶导数滤波器的孔径大小。大小必须是正数和奇数。
上述代码的输出:
拉普拉斯边缘检测:
1.3 Sobel边缘检测:
在计算拉普拉斯量时,我们计算了二阶导数,称为Sobel。因此,在Sobel检测中,我们将计算Sobelx(也称为水平Sobel导数)和Sobely(也称为垂直Sobel导数)。我们可以通过与大小为3*3的核的输入图像进行卷积来计算SOBELX和SOBASE(但我们可以根据需要改变核的大小)。
拉普拉斯公式中的Sobelx和Sobely:
卷积中提到的3*3矩阵为:
Sobel边缘检测的代码演练。
上述代码的输出:
Sobelx:
索比利:
合并Sobel和Sobel的POST:
1.4.侵蚀和膨胀:
1.4.1侵蚀:
- 它对消除小的白噪声很有用。
- 用于分离两个相连的物体等。
它的工作原理:
1.4.2扩容:
- 在像去噪这样的情况下,侵蚀之后是膨胀。因为,侵蚀去除了白噪音,但也缩小了我们的物体。所以我们把它放大。既然噪音消失了,它们就不会回来了,但是我们的目标面积增加了。
- 它在连接对象的破碎部分时也很有用。
它的工作原理:
膨胀和侵蚀的代码演练:
上述代码的输出:
将图像输入到cv.diplate():
膨胀:它会增加边缘的厚度
侵蚀:这里的输入图像是cv.diplate输出。所以现在侵蚀输出会恢复输入图像的扩张。
2)如何进行镜像中的轮廓检测?
有时,如果我们对图像进行边缘检测和轮廓检测,那么两者的输出可能看起来相似。但一般来说,与边缘检测相比,轮廓检测将更加详细。
cv.findContours函数中的一些重要参数包括:
图像:输入图像应为二进制As Source,8位单通道图像。非零像素被视为1,零像素仍为0,因此图像被视为二进制。
等高线检索模式:
1)cv.RETR_TREE→它将给出图像中的分层轮廓。
2)cv.RETR_EXTERNAL→它将只给出图像中的外部轮廓。
3)cv.RETR_LIST→它将给出图像中存在的所有轮廓。
轮廓近似方法:
1)CHAIN_APPROX_NONE→它将给出映像中存在的所有计数器。
2)CHAIN_APPROX_SIMPLE→它将给出图像中的重要轮廓,例如,如果我们有直线,它将只给出图像中的起点和终点,而在CHAIN_APPROX_NONE的情况下,我们会得到所有的点。
现在让我们来看看它实际上是如何工作的。
上图输出:
现在我们将模糊图像并检查等高线的数量
上述代码的输出:
通过对图像及其总轮廓线的观察,可以看出模糊图像中的轮廓线比原始图像的轮廓数要少。现在我们将尝试在空白图像上绘制图像的轮廓
上述代码的输出:
用于查找等高线的图像:
在空白图像上绘制等高线:
3)如何在画面中进行色彩间隔?
我们知道每种颜色都是红、绿、蓝三种颜色的组合。因此,我们通常将颜色间隔称为RGB,如果我们分析图像和视频,同样也适用。但在OpenCV中,颜色间隔的顺序相反,即BGR。检查下面提到的代码,我们将在其中使用OpenCV和matplotlib显示图像,并观察更改。
使用OpenCV创建BGR图像:
与我们将使用matplotlib尝试绘制的图像相同
因此,我们在这里观察到,由于颜色间隔从BGR改变为RGB,所以颜色发生了相反的变化。
现在,我们将检查如何使用cv.cvtColor()方法将BGR颜色间隔转换为不同的颜色间隔
3.1)BGR至Gray:
输出:
3.2)BGR至HSV:
输出:
3.3)实验室的BGR:
输出:
3.4)BGR至RGB:
输出:
我们还可以通过使用下面提到的颜色间隔参数来反转上述图像颜色间隔:
cv.COLOR_HSV2BGR
cv.COLOR_LAB2BGR
cv.COLOR_GRAY2BGR
cv.COLOR_BGR2RGB
4)如何处理颜色通道?
在OpenCV中,我们可以从原始图像中拆分B、G、R通道,然后再次合并所有的B、G、R通道,如下所示。
上述代码的输出:
原图:
具有蓝色像素的图像:
带有绿色像素的图像:
带有红色像素的图像:
合并所有三个BGR通道的图像后期处理:
上面的分割图像是以灰度图像的形式反映的,因此为了清楚地了解每个通道,我们将尝试将这些分割图像绘制在空白屏幕上,然后检查通道。现在,我们将对空白图像分别使用B、G、R像素,并获得以下提到的输出:
上述代码的输出:
蓝色通道:
绿色通道:
红色通道:
5)如何模糊图像?
模糊图像有不同的方法。有关详细信息,请查看下面提到的代码演练:
平均模糊:
在这里,我们将输入原始图像,并将其与内核进行卷积。随着核大小的增加,图像的模糊度也随之增加。
高斯模糊:
在这里,我们将输入原始图像,并将其与内核进行卷积。随着核大小的增加,图像的模糊度也随之增加。我们还应该指定X和Y方向的标准偏差,分别为sigmaX和sigmaY。如果仅指定了SigmaX,则将SigmaY视为与SigmaX相同。如果两者都指定为零,则根据内核大小计算它们。高斯模糊在从图像中去除高斯噪声方面非常有效。
中间模糊:
函数cv.medianBlur()取内核区域下所有像素的中值,中心元素替换为该中值。这对图像中的胡椒盐噪声非常有效。在这里,我们将输入原始图像,并将其与内核进行卷积。随着核大小的增加,图像的模糊度也随之增加。但是这里的核大小是一维形状,而不是像平均和高斯那样的二维形状。cv.medianBlur()
双边模糊:
cv.bilateralFilter()在去除噪波的同时保持边缘锐化非常有效。但与其他过滤器相比,操作速度较慢。我们已经看到,高斯过滤采用像素周围的邻域,并找到其高斯加权平均。这种高斯过滤只是空间的函数,也就是说,滤波时会考虑附近的像素。它不考虑像素是否具有几乎相同的强度。它不考虑像素是否为边缘像素。所以它也会模糊边缘,这是我们不想做的。在这里,我们将输入原始图像,并将其与内核进行卷积。随着核大小的增加,图像的模糊度也随之增加。但是这里的核大小是一维形状,而不是像平均和高斯那样的二维形状。此外,为简单起见,我们可以将2西格马值设置为相同。如果它们很小(<10),过滤的效果不会太大;如果它们很大(>150),效果会很强,让图像看起来很卡通。cv.bilateralFilter()
上述代码的输出:
原图:
平均模糊图像:
高斯模糊图像:
中间模糊图像:
双边模糊图像:
6)如何使用BITWISE运算符?
最常用的BITWISE运算符有4种,分别是AND、OR、XOR和NOT。
BITWISE AND:它将仅显示输入图像的相交像素
检查下面提到的代码并输出
上述代码的输出:
ORG_IMG_1:
ORG_IMG_2:
BITWISE_AND:
BITWISE OR:它将显示图像的相交像素和非相交像素。
检查下面提到的代码并输出
上述代码的输出:
BITWISE XOR:它将显示图像的不相交像素。
检查下面提到的代码并输出
上述代码的输出:
BITWISE NOT:它起到否定的作用,即它会颠倒图像的颜色空间。
检查下面提到的代码并输出
上述代码的输出:
7)如何绘制图像每个像素的颜色直方图?
7.1.BGR图像:
我们将尝试使用matplotlib绘制所有三个通道BGR的直方图。有关详细信息,请查看下面提到的代码和输出:
上述代码的输出:
BGR图像:
直方图:
7.2.灰度图像:
我们将把原始图像转换成灰度图像,然后尝试绘制该图像像素的直方图。有关详细信息,请查看下面提到的代码和输出:
上述代码的输出:
灰度图像:
直方图:
摘要:
这就是我所说的,现在我们已经完成了Blog1中OpenCV的基本和高级内容,这个博客已经报道了OpenCV中的一些高级内容,这主要是在计算机视觉任务的情况下使用的。现在将会有最后一篇博客来总结这一系列的OpenCV即将出版。Blog1
配置文件:
感谢您的阅读!请鼓掌感谢我的辛勤工作。我总是对建设性的反馈持开放态度–如果你对这篇分析有后续的想法,请在下面发表评论或通过LinkedIn联系。via LinkedIn.
参考文献:
1)https://www.youtube.com/watch?v=oXlwWbU8l2o&t=8707shttps://www.youtube.com/watch?v=oXlwWbU8l2o&t=8707s
2)https://docs.opencv.org/master/d6/d00/tutorial_py_root.htmlhttps://docs.opencv.org/master/d6/d00/tutorial_py_root.html
3)https://www.geeksforgeeks.org/3) https://www.geeksforgeeks.org/
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/06/24/%e6%ac%a2%e8%bf%8e%e5%ad%a6%e4%b9%a0opencv%e6%8c%87%e5%8d%97%e7%ac%ac2%e9%83%a8%e5%88%86/