第20课 Canny边缘检测

1. Canny算法介绍

  • Canny是边缘检测算法,在1986年提出的。
  • 是一个很好的边缘检测器
  • 很常用也很实用的图像处理方法

1.1 Canny算法包括

  • 高斯模糊
  • 灰度转换
  • 计算梯度
  • 非最大信号抑制
  • 高低阈值输出二值图像

1.1.1 非最大信号抑制

在这里插入图片描述
在这里插入图片描述

1.1.2 高低阈值输出二值图像

  • T1, T2为阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留。最终得到一个输出二值图像。
  • 推荐的高低阈值比值为 T2: T1 = 3:1/2:1其中T2为高阈值,T1为低阈值

2. cv::Canny() API

Canny(
InputArray src, // 8-bit的输入图像
OutputArray edges,// 输出边缘图像, 一般都是二值图像,背景是黑色
double threshold1,// 低阈值,常取高阈值的1/2或者1/3
double threshold2,// 高阈值, 设为threshold1*2即可
int aptertureSize,// Soble算子的size,通常3x3,取值3
bool L2gradient // 选择 true表示是L2来归一化(即使用准确公式计算,效率较低),否则用L1归一化(即使用近似公式计算,效率较高)
)

其中关于最后一个参数:
在这里插入图片描述
在这里插入图片描述
默认情况一般选择是L1,参数设置为false。

在这里插入图片描述

3. 例程

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

Mat src, dst;
int threshold1 = 50;
void Canny_Demo(int, void*);
Mat  blur_image;
int main() {
	
	src = imread("D:/resource/images/face.jpg");

	if (!src.data) {
		printf("the image couldn't be loaded...");
		return -1;
	}
	imshow("input image", src);

	namedWindow("output image");
	
	GaussianBlur(src, blur_image, Size(3,3),0);
	createTrackbar("threshold1", "output image", &threshold1, 255, Canny_Demo);
	Canny_Demo(0, 0);


	waitKey(0);
	return 1;

}
void Canny_Demo(int, void*) {

	Canny(blur_image, dst, threshold1, threshold1 * 2);
	imshow("output image", dst);
}
发布了31 篇原创文章 · 获赞 12 · 访问量 2767

猜你喜欢

转载自blog.csdn.net/weixin_42877426/article/details/104246408
今日推荐