边缘检测是一种图像处理技术 用于识别图像中目标或区域的边界(边缘)。边缘是图像中最重要的特征之一。我们通过图像的边缘来了解图像的基本结构。因此 计算机视觉处理管道在应用中广泛地使用边缘检测。
1.如何检测边缘?边缘的特征是像素强度的突然变化。为了检测边缘 我们需要在邻近的像素中寻找这些变化。来吧 让我们探讨一下OpenCV中可用的两种重要边缘检测算法的使用:Sobel边缘检测和Canny边缘检测。我们将讨论这些理论 并演示它们在OpenCV中的使用。
2.简单的代码示例首先 看一看演示边缘检测的代码。我们将详细讨论每一行代码 以便您能够完全理解它。
1 Python
import cv2 # 读取原始图像 img cv2.imread( test.jpg ) # 显示原始图像 cv2.imshow( Original , img) cv2.waitKey(0) # 转换为灰度图 img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 模糊图像以更好地检测边缘 img_blur cv2.GaussianBlur(img_gray, (3,3), 0) # Sobel边缘检测 sobelx cv2.Sobel(src img_blur, ddepth cv2.CV_64F, dx 1, dy 0, ksize 5) # X轴上的Sobel边缘检测 sobely cv2.Sobel(src img_blur, ddepth cv2.CV_64F, dx 0, dy 1, ksize 5) # Y轴上的Sobel边缘检测 sobelxy cv2.Sobel(src img_blur, ddepth cv2.CV_64F, dx 1, dy 1, ksize 5) # 结合X和Y的Sobel边缘检测 # 显示Sobel边缘检测图像 cv2.imshow( Sobel X , sobelx) cv2.waitKey(0) cv2.imshow( Sobel Y , sobely) cv2.waitKey(0) cv2.imshow( Sobel X Y using Sobel() function , sobelxy) # Canny边缘检测 edges cv2.Canny(image img_blur, threshold1 100, threshold2 200) # 显示Canny边缘检测图像 cv2.imshow( Canny Edge Detection , edges) cv2.waitKey(0)
2 C
#include opencv2/opencv.hpp #include iostream // 命名空间 using namespace std; using namespace cv; int main() // 读取原始图像 Mat img imread( test.jpg ); // 显示原始图像 imshow( original Image , img); waitKey(0); // 转换为灰度图 Mat img_gray; cvtColor(img, img_gray, COLOR_BGR2GRAY); // 模糊图像以更好地检测边缘 Mat img_blur; GaussianBlur(img_gray, img_blur, Size(3,3), 0); // Sobel边缘检测 Mat sobelx, sobely, sobelxy; Sobel(img_blur, sobelx, CV_64F, 1, 0, 5); Sobel(img_blur, sobely, CV_64F, 0, 1, 5); Sobel(img_blur, sobelxy, CV_64F, 1, 1, 5); // 显示Sobel边缘检测图像 imshow( Sobel X , sobelx); waitKey(0); imshow( Sobel Y , sobely); waitKey(0); imshow( Sobel XY using Sobel() function , sobelxy); waitKey(0); // Canny 边缘检测 Mat edges; Canny(img_blur, edges, 100, 200, 3, false); // 显示Canny边缘检测图像 imshow( Canny edge detection , edges); waitKey(0); destroyAllWindows(); return 0;
查看Sobel图像在x方向上主要识别垂直边缘(即那些在x方向上梯度最大的)。而在y方向上则表示水平边(即在y方向上梯度最大的)。仔细看看这两张照片上老虎的条纹。注意 在Sobel图像中 条纹的垂直边缘在x方向上更加明显。对Sobel图像进行两个方向的梯度 将原始图像提取为边缘结构表示 使其结构完整性保持不变。
我们使用的下限为100 上限为200。正如你所看到的 该算法已经识别出了图像中的主要边缘 在这个过程中消除了那些对整体结构不太重要的边缘。然而 结果可以很容易地调整 所以去尝试不同的图像 改变模糊的数量 并尝试不同的阈值来获得自己的感觉。
3.Sobel边缘检测Sobel边缘检测是应用最广泛的边缘检测算法之一。Sobel算子检测像素强度突然变化的边缘 如下图所示。
当我们画出强度函数的一阶导数时 强度的增加就更加明显了。
从上图可以看出 在梯度高于某一特定阈值的区域可以检测到边缘。此外 导数的突然变化也会显示像素强度的变化。记住这个 我们可以用3×3核来近似导数。我们使用一个核来检测X方向上像素强度的突然变化 另一个在Y方向上。
这些是用于Sobel边缘检测的核:
当这些核与原始图像进行卷积时 就得到了Sobel边缘图像.



