本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:denoising

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

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src = imread("../sample/lena512color.bmp");
	if (src.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	// Canny Demo
	Mat edges, dst;
	Canny(src, edges, 50, 150);
	bitwise_and(src, src, dst, edges);
	imshow("edges", dst);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

边缘定义

opencv4入门笔记(24):边缘提取-萤火
  • 边缘法线:单位向量在该方向上图像像素强度变化最大
  • 边缘方向:与边缘法线垂直的向量方向
  • 边缘位置或中心:图像边缘所在位置
  • 边缘强度:跟沿法线方向的图像局部对比相关,对比越大,越是边缘

边缘类型

  • 跃迁类型
opencv4入门笔记(24):边缘提取-萤火
  • 屋脊类型
opencv4入门笔记(24):边缘提取-萤火

提取方式

  • 基于梯度的边缘提取
opencv4入门笔记(24):边缘提取-萤火

Roberts、Sobel、Prewitt算子

  • Canny边缘提取

Canny:使用canny寻找图像边缘

opencv4入门笔记(24):边缘提取-萤火
高低阈值连接:低阈值T1,高阈值T2,T2/T1=2~3。大于高阈值T2的全部保留,小于低阈值T1的全部丢弃;在T1~T2之间的,可以连接到高阈值像素点,保留,无法连接,丢弃(连接方式:8-连通)
void Canny( InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false );
  • image:输入图像,8-bit
  • edges:输出边缘图,与src具有相同的尺寸,8UC1
  • threshold1:低阈值
  • threshold2:高阈值
  • apertureSize:Sobel算子的卷积核size
  • L2gradient:是否是计算L2梯度