opencv c++ 边缘提取

1、边缘

1.1 边缘定义

        以图像像素值突变最大的方向作为边缘法线,与边缘法线垂直的就是边缘。

        边缘强度:局部图像上的像素值突变程度(图像局部一阶梯度和二阶梯度值)。

        opencv c++ 边缘提取_第1张图片

 1.2 边缘类别

跃迁类型                                                           屋脊类型

opencv c++ 边缘提取_第2张图片opencv c++ 边缘提取_第3张图片

 2、边缘提取

2.1 基于梯度的边缘提取

        步骤:高斯模糊去噪(选用3×3的核),再基于梯度提取边缘(使用robert算子、sobels算子、prewitt算子),最后对图像梯度进行阈值处理,大于T的保留,小于T的舍弃。

opencv c++ 边缘提取_第4张图片

         缺点:单一阈值使得边缘图像不够连贯

 2.2 Canny边缘提取

        步骤:

        1、滤波处理(高斯滤波)。

        2、使用梯度算子获取梯度值G、梯度方向\Theta

        3、非最大抑制:保留与\Theta垂直方向上,梯度值最大的像素点,如下左1、2图上,当红框的像素点值,是在橙色箭头方向上最大的,则保留。

在实际应用中为减少运算量,只会对如下\frac{\pi }{4}\frac{\pi }{2}\frac{3\pi }{4}等角度的梯度进行非最大抑制。

opencv c++ 边缘提取_第5张图片opencv c++ 边缘提取_第6张图片opencv c++ 边缘提取_第7张图片

        4、高低阈值链接,分别设定高低阈值T1、T2,一般T1/T2 = 2~3,将像素值大于T1的像素点全部保留,小于T2的全部舍弃,T1到T2之间的如果在其八邻域内高阈值保留像素点,则保留,反之丢弃。

opencv c++ 边缘提取_第8张图片  opencv c++ 边缘提取_第9张图片

 代码示例:

static void cannny_track_bar(int b, void* image_data) {
	//canny
	Mat image = *((Mat*)image_data);
	Mat edge1;
	Canny(image, edge1, b, b*2, 3);
	imshow("canny", edge1);
}
void edge_catch(Mat& image)
{
	namedWindow("canny", WINDOW_FREERATIO);
	int t = 50;
	createTrackbar("canny bar", "canny", &t, 100, cannny_track_bar,(void*)&image);
	cannny_track_bar(50, &image);
}

 结果:

 

 

 

你可能感兴趣的:(opencv,c++,opencv,计算机视觉,图像处理)