在上篇文章中,我们已经学习了 OpenCV 的基础知识。我们已经看到了如何执行图像和视频调整大小、裁剪等,这是 OpenCV 教程的第二部分。
本文,我们主要关注 OpenCV 的高级部分,它将涵盖以下提到的问题。但是,如果你是 OpenCV 的新手或觉得这很难理解,那么请访问OpenCV 基础指南第1部分并复习基础知识,然后再回到此文。
https://mp.weixin.qq.com/s/cy47czfnMA1QnNxCt2AHBQ
我们思考的问题是:
☞如何在图像中进行边缘检测?
☞如何在图像中进行轮廓检测?
☞如何在图像中执行颜色空间?
☞如何处理颜色通道?
☞如何模糊图像?
☞如何使用位运算符?
☞如何在图像的每个像素点绘制颜色的直方图?
1)如何在图像中进行边缘检测?
1.1. Canny:
对于这里的边缘检测,我们将使用 cv.Canny 方法。
输入图像为原始图像,thereshold-1 即像素值低于150 被视为非边缘,threshold-2 即像素值高于175 被视为有效边缘。如果该值在 150 和 175 之间,那么如果边缘像素与有效边缘相连,则仅将其视为有效边缘。
original_img=cv.imread("/content/drive/MyDrive/Colab Notebooks/Opencv/NCS/hana-lshin-qUhu8zjm38w-unsplash(1).jpg")
cv2_imshow(original_img)
print("\n \n Edge detection in the Original images\n \n ")
#We will find the edges in the image as below
Edge_Org=cv.Canny(original_img,150,175)
cv2_imshow(Edge_Org)
上述代码的输出:
原图:
原始图像的边缘:
现在我们将尝试通过使其模糊来找到原始图像的边缘。
博客中进一步介绍了如何使图像模糊。
通过比较原始图像和模糊图像之间的边缘检测。我们知道图像中的边缘检测随着图像模糊程度的增加而减少。
1.2. 拉普拉斯算子
在拉普拉斯边缘检测方法中,我们将计算源图像的 (x,y) 像素的第二个梯度。
当 ksize>1 时,查看下面提到的源图像的拉普拉斯公式:
当 ksize=1 时,拉普拉斯算子是通过使用以下 3×3 孔径过滤图像来计算:
其中 ksize:用于计算二阶导数滤波器的孔径大小。大小必须是正数和奇数。
lap=cv.Laplacian(original_img,cv.CV_64F)
lap=np.uint8(np.absolute(lap))
cv2_imshow(lap)
上述代码的输出:
拉普拉斯边缘检测:
1.3.Sobel边缘检测
在计算拉普拉斯算子时,我们计算了称为 Sobel 的二阶导数。因此,在 sobel 检测中,我们将计算 sobelx(也称为水平 Sobel 导数)和 sobely(也称为垂直 Sobel 导数)。
我们可以通过输入图像与大小为 3*3 的内核进行卷积,来计算 Sobelx 和 sobely(但我们可以根据需要更改内核大小)。
拉普拉斯公式中的 Sobelx 和 sobely:
提到的卷积的 3*3 矩阵是:
Sobel 边缘检测的代码:
#Sobel
Sobelx=cv.Sobel(Gray_1,cv.CV_64F,1,0)
Sobely=cv.Sobel(Gray_1,cv.CV_64F,0,1)
Cpmbine_Sobel=cv.bitwise_or(Sobelx,Sobely)
print("\n\n SobelX Edge Detection\n\n")
cv2_imshow(Sobelx)
print("\n\n Sobely Edge Detection\n\n")
cv2_imshow(Sobely)
print("\n\n ombine Sobel Edge Detection\n\n")
cv2_imshow(Cpmbine_Sobel)
上述代码的输出:
Sobelx:
Sobely:
结合Sobel:
1.4. 腐蚀和膨胀