【OpenCV3经典编程100例】(16)边缘检测:最优边缘检测算子Canny算子,Canny()函数

边缘检测:最优边缘检测算子Canny算子。

API函数:Canny()函数

void Canny(InputArray image,//输入图像,必须为单通道8位
		OutputArray edges,//输出的边缘图
		double threshold1,//低阈值
		double threshold2,//高阈值
		int apertureSize = 3,//默认为3,Sobel算子的孔径大小
		bool L2gradient = false);//默认

一、c++示例代码

//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分

//主函数
int main()
{
	//【1】载入图像
	Mat image = imread("F:\\opencvtest\\testImage\\beauty.png");
	//【2】检查是否载入成功
	if (image.empty())
	{
		printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
		return 0;
	}
	//【3】转换为灰度图像
	Mat grayImage;
	cvtColor(image, grayImage, COLOR_BGR2GRAY);
	//【4】图像平滑降噪
	Mat result;
	blur(grayImage, result, Size(3,3));
	//【5】Canny算子进行边缘检测
	Mat edge;
	Canny(result, edge, 20, 60, 3);
	//【6】阈值化处理生成二值图像
	Mat binaryImage;
	threshold(edge, binaryImage, 20, 255, THRESH_BINARY_INV);
	//【7】显示图像
	imshow("16-边缘检测图", edge);
	imshow("16-二值图像", binaryImage);
	//【8】保持窗口显示
	waitKey(0);
	return 0;
}

二、运行截图

1.灰度原图


2.边缘检测图


3.阈值化处理生成二值图像


三、数字图像处理知识

1.边缘特征

“边缘”通常定义为影像局部特征不相同的那些区域间的分界线,表现为局部影像的不连续,例如呈现出灰度级的突变,纹理结构突变等。

2.Canny算子

一般基于Sobel算子。

低阈值:小于低阈值的边缘像素被排除。

高阈值:大于高阈值的边缘像素被保留。

介于两个阈值之间的:需要判断是否保留。若像素与高阈值图像中的边相连接,则保留。


猜你喜欢

转载自blog.csdn.net/misterjiajia/article/details/80375934