上海网站营销seo,做网站编辑器,php 网站开发平台,国内建筑设计公司前十名1、canny边缘检测应用场景
目标检测#xff1a; Canny边缘检测可以用于检测图像中的目标边缘#xff0c;从而帮助识别和定位物体。在目标检测的流程中#xff0c;边缘通常是检测的第一步。 图像分割#xff1a; Canny边缘检测可用于图像分割#xff0c;即将图像划分为具有…1、canny边缘检测应用场景
目标检测 Canny边缘检测可以用于检测图像中的目标边缘从而帮助识别和定位物体。在目标检测的流程中边缘通常是检测的第一步。 图像分割 Canny边缘检测可用于图像分割即将图像划分为具有相似属性的区域。图像分割是许多计算机视觉任务的基础如图像分析、物体识别等。 图像增强 Canny边缘检测可以突出图像中的边缘特征从而增强图像的结构信息。这对于图像处理任务如图像重建和特征提取非常有帮助。 边缘跟踪 Canny边缘检测是一种强边缘跟踪器可以用于跟踪图像中的曲线和边缘。 机器视觉和自动驾驶 在机器视觉和自动驾驶系统中Canny边缘检测可用于检测道路边缘、车辆和行人等物体。 医学图像处理 在医学图像中Canny边缘检测用于检测器官的边缘从而协助医生进行诊断和手术规划。 光学字符识别OCR 在文字识别领域Canny边缘检测可用于提取文本的边缘以帮助进行光学字符识别。 图像分析 Canny边缘检测在图像分析中是一种常见的工具用于提取图像的重要特征。
2、canny边缘检测步骤 1噪声抑制 在进行边缘检测之前通常会对图像进行平滑以抑制噪声。这通常使用高斯滤波器来实现可以通过cv::GaussianBlur函数完成。 2计算图像梯度 使用Sobel算子计算图像在水平和垂直方向上的梯度。这个过程可以通过cv::Sobel函数实现。 3计算梯度的幅值和方向 根据梯度的水平和垂直分量计算梯度的幅值和方向。这可以通过cv::magnitude和cv::phase实现。 4非极大值抑制 对梯度幅值图进行非极大值抑制保留梯度方向上的局部最大值。这一步骤有助于细化边缘使其更接近实际的边界。 5双阈值边缘跟踪 根据设定的两个阈值高阈值和低阈值对非极大值抑制后的图像进行阈值处理得到二值图像。高阈值用于确定强边缘低阈值用于确定可能的边缘。通常高阈值选取的较高低阈值选取的较低。 6边缘连接 对低阈值下的边缘像素进行连接使其连接到高阈值下的边缘。这一步骤可以使用递归或迭代方法实现。
对于高斯滤波和梯度计算在之前的章节已经阐述过请点击高斯滤波和梯度计算进行回顾。
这里解释下什么是梯度幅值和方向 边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度和方向用角度值表示为 式中atan2(•)表示具有两个参数的 arctan 函数。
梯度幅值是梯度矢量的长度表示图像在某一点的强度变化的大小梯度的方向总是与边缘垂直的通常就近取值为水平左、右、垂直上、下、对角线右上、左上、左下、右下等 8 个不同的方向。
因此在计算梯度时我们会得到梯度的幅度和角度代表梯度的方向两个值。
下图展示了梯度的表示法。其中每一个梯度包含幅度和角度两个不同的值。为了方便观察这里使用了可视化表示方法。例如左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”表示梯度的幅度为 2角度为 90°。
非极大值像素梯度抑制 在具体实现时逐一遍历像素点判断当前像素点是否是周围像素点中具有相同梯度方向的最大值并根据判断结果决定是否抑制该点。如果当前像素点是周围像素点中最大值我们保留该像素值否则将其抑制为零。
例如A、B、C 三点具有相同的方向梯度方向垂直于边缘如下图。判断这三个点是否为各自的局部最大值如果是则保留该点否则抑制该点归零。 从图中可以看到A点在图像边缘所以A 点具有最大的局部值所以保留 A 点称为边缘其余两点B和 C被抑制归零。
再比如下图中黑色背景的点都是向上方向梯度边缘处于水平的局部最大值。因此这些点会被保留其余点被抑制处理为 0。这意味着这些黑色背景的点最终会被处理为边缘点而其他点都被处理为非边缘点。 经过上述处理后对于同一个方向的若干个边缘点基本上仅保留了一个使得检测到的边缘更狭窄更接近实际的边界。
当完成非极大值抑制后只保留了效果明显的边缘然而对于这些边缘有些确实是图像的边缘而有些却是由噪声产生的。之前用高斯滤波只是降噪并不能消除噪声。而这些噪声造成的边缘被称为虚边缘我们需要通过双值域将其消除。
双阈值设置 首先设置两个阈值高阈值highThreshold和低阈值lowThreshold高阈值用于确定强边缘低阈值用于确定可能的边缘。对于所有的像素点逐一遍历如果当前边缘像素的梯度值 大于高阈值定为强边缘 低于高阈值但是高于低阈值被定为虚边缘 低于低阈值的像素点抑制置零。 所有的强边缘保留而对于虚边缘我们要做个判断。如果这些虚边缘是连接着强边缘的那么保留如果不是那么抑制置零。
下面以一个示例图来说明。 图中Max和Min表示高低阈值A在Max上面为强边缘直接保留B在Max和Min之间为虚边缘但B连着B故也认定为边缘保留。C也处于Max和Min之间但C和A没有连接故认定C不是边缘被抑制。D之间小于低阈值之间被抑制为0。
最后进行边缘连接其过程如下 1遍历经过非极大值抑制后的梯度幅值图像图像经过非极大值抑制后只有边缘上的像素点的梯度幅值被保留其他像素点的梯度幅值为零。 2将大于高阈值的像素点标记为强边缘高低阈值之间的像素值标记为弱边缘。 3从弱边缘像素出发沿着其梯度方向前进如果相邻像素中有强边缘像素梯度幅值大于高阈值则将其标记为强边缘并继续追踪。追踪过程中可能的边缘像素逐渐被标记为强边缘形成一个连接的边缘。 4重复以上步骤直到没有新的像素被添加到连接的边缘。最终连接的边缘像素集合就是Canny边缘检测算法的输出。
3、opencv之canny接口调用
void cv::Canny(InputArray image, // 输入图像单通道8位灰度图像OutputArray edges, // 输出边缘图像double threshold1, // 低阈值double threshold2, // 高阈值int apertureSize 3, // Sobel算子核的大小默认为3bool L2gradient false // 是否使用更精确的L2范数梯度计算默认为false
);
双阈值怎么设定
通常建议高阈值与低阈值的比例在2:1到3:1之间。 例如如果设置高阈值为100则低阈值可以设置为50或33。 根据图像特性 可以根据图像的特性来调整阈值。如果图像中的边缘比较弱可以适当降低阈值如果图像中的边缘比较强可以适当提高阈值。
参考代码
int main()
{ // 读取灰度图像cv::Mat image cv::imread(1.jpg, cv::IMREAD_GRAYSCALE);// 检查图像是否成功读取if (image.empty()) {std::cerr Error: Could not read the image. std::endl;return -1;}// 应用Canny边缘检测cv::Mat edges;double lowThreshold 50; // 低阈值double highThreshold 150; // 高阈值//高斯滤波去噪后检测图像边缘GaussianBlur(image, image, Size(3, 3), 0);cv::Canny(image, edges, lowThreshold, highThreshold);// 显示原始图像和Canny边缘检测的输出cv::imshow(Original Image, image);cv::imshow(Canny Edges, edges);// 等待用户按键cv::waitKey(0);return 0;
}
效果图如下 左边是之间通过canny检测的边缘右边是先通过高斯滤波去噪后再使用canny检测的边缘可以明显的发现先去噪再检测边缘效果会更好。
参考文章opencv基础44- Canny边缘检测详解-cv.Canny()