建设网站会员,wordpress页脚添加图片,模板网站跟仿站的区别,如何查看网站名称操作系统#xff1a;ubuntu22.04OpenCV版本#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言#xff1a;C11
算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出#xff0c;旨在寻找给定噪声条件下的最佳边…操作系统ubuntu22.04OpenCV版本OpenCV4.9IDE:Visual Studio Code编程语言C11
算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出旨在寻找给定噪声条件下的最佳边缘检测算法。Canny算法的主要特点和步骤包括
应用高斯滤波首先使用高斯滤波器平滑图像以去除噪声并减少细节这有助于后续步骤中的边缘检测。计算梯度强度和方向接下来通过对平滑后的图像应用Sobel算子计算每个像素的梯度强度和方向。梯度强度指示了边缘的强度而方向指示了边缘的方向。非极大值抑制在计算了梯度之后执行非极大值抑制Non-maximum suppression。这一步骤涉及检查每个像素的梯度强度是否是局部最大值。如果不是则认为该像素不是边缘的一部分因此将其强度设置为零。双阈值检测和边缘连接最后应用两个阈值低阈值和高阈值。高于高阈值的边缘被确认为真正的边缘而低于低阈值的边缘则被抛弃。介于两阈值之间的边缘仅在与高于高阈值的边缘相连时才被保留这是为了防止断断续续的边缘。 Canny算法因其在检测真实边缘的同时最大限度地减少错误检测和响应重复性方面的良好性能而受到推崇。在OpenCV中可以通过调用Canny函数来应用Canny算法进行边缘检测
Canny函数 该函数使用Canny算法在输入图像中查找边缘并在输出映射edges中标记它们。在threshold1和threshold2之间较小的值用于边缘连接而较大的值用于寻找初始的强边缘段。更多信息请参考Canny边缘检测器的维基百科页面http://en.wikipedia.org/wiki/Canny_edge_detector
函数原型1
void cv::Canny
( InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize 3,bool L2gradient false
) 参数1
参数image 8位输入图像.通常应该是灰度图像参数 edges 输出的边缘图单通道8位图像其尺寸与image相同.这个输出图像将标记出检测到的边缘参数threshold1 滞后阈值程序的第一阈值这是一个较低的阈值用于确定哪些边缘应被进一步考虑。低于此阈值的像素会被视为非边缘参数threshold2 滞后阈值程序的第二阈值。这是一个较高的阈值用于确定哪些边缘是强边缘。高于此阈值的像素将被确定为边缘参数apertureSize Sobel算子的孔径大小。Sobel算子用于计算图像中每个像素的梯度孔径大小决定了Sobel算子的大小这会影响边缘检测的精细程度。参数L2gradient 一个标志指示是否应该使用更精确的 L 2 L_2 L2 n o r m ( d I / d x ) 2 ( d I / d y ) 2 norm\sqrt{(dI/dx)^2 (dI/dy)^2} norm(dI/dx)2(dI/dy)2 范数来计算图像的梯度大小L2gradienttrue或者是否默认的 L 1 L_1 L1 n o r m ∣ d I / d x ∣ ∣ d I / d y ∣ norm|dI/dx||dI/dy| norm∣dI/dx∣∣dI/dy∣ 范数就足够L2gradientfalse。L2范数是梯度向量的欧几里得长度而L1范数是梯度分量的绝对值之和。
函数原型2 这是一个重载成员函数为了方便而提供。它与上述函数的不同之处仅在于它接受的参数。使用带有自定义图像梯度的Canny算法在图像中查找边缘
void cv::Canny
(InputArray dx,InputArray dy,OutputArray edges,double threshold1,double threshold2,bool L2gradient false
) 参数2
参数dx 输入图像的16位x方向导数类型为CV_16SC1或CV_16SC3。这表示沿着x轴方向的图像梯度。参数dy 输入图像的16位y方向导数与dx同类型。这表示沿着y轴方向的图像梯度。参数 edges 输出的边缘图单通道8位图像其尺寸与image相同.这个输出图像将标记出检测到的边缘参数threshold1 滞后阈值程序的第一阈值这是一个较低的阈值用于确定哪些边缘应被进一步考虑。低于此阈值的像素会被视为非边缘参数threshold2 滞后阈值程序的第二阈值。这是一个较高的阈值用于确定哪些边缘是强边缘。高于此阈值的像素将被确定为边缘参数apertureSize Sobel算子的孔径大小。Sobel算子用于计算图像中每个像素的梯度孔径大小决定了Sobel算子的大小这会影响边缘检测的精细程度。参数L2gradient 一个标志指示是否应该使用更精确的 L 2 L_2 L2 n o r m ( d I / d x ) 2 ( d I / d y ) 2 norm\sqrt{(dI/dx)^2 (dI/dy)^2} norm(dI/dx)2(dI/dy)2 范数来计算图像的梯度大小L2gradienttrue或者是否默认的 L 1 L_1 L1 n o r m ∣ d I / d x ∣ ∣ d I / d y ∣ norm|dI/dx||dI/dy| norm∣dI/dx∣∣dI/dy∣ 范数就足够L2gradientfalse。L2范数是梯度向量的欧几里得长度而L1范数是梯度分量的绝对值之和。
代码示例 #include opencv2/opencv.hpp
#include iostreamint main(int argc, char** argv)
{// 读取图像cv::Mat image cv::imread(/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg, cv::IMREAD_COLOR);if (!image.data){std::cout Error: Could not open or find the image. std::endl;return -1;}// 转换为灰度图像cv::Mat grayImage;cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);// 使用Canny算法检测边缘cv::Mat edges;int lowThreshold 50;int highThreshold 150;cv::Canny(grayImage, edges, lowThreshold, highThreshold);// 显示原始图像和边缘图像cv::namedWindow(Original Image, cv::WINDOW_NORMAL);cv::imshow(Original Image, image);cv::namedWindow(Edges, cv::WINDOW_NORMAL);cv::imshow(Edges, edges);// 等待按键后关闭窗口cv::waitKey(0);return 0;
}运行结果
原图 边缘计算之后的图 你可以调整lowThreshold和highThreshold的值再运行后观察边缘图像的变化便于理解函数的使用。