文档章节

OpenCV边缘检测算子原理总结及实现

漫长当下TIME
 漫长当下TIME
发布于 2018/08/17 23:33
字数 1355
阅读 114
收藏 2

 

1. 拉普拉斯算子

    原理:是一种基于图像导数运算的高通线性滤波器。它通过二阶导数来度量图像函数的曲率。

        拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉普拉斯变换是各向同性的二阶导数,定义为:

                                        

用更加形象的图像来解释,假设我们有一张一维图形。下图(a)中灰度值的”跃升”表示边缘的存在.如果使用一阶微分求导我们可以更加清晰的看到边缘”跃升”的存在(这里显示为高峰值)图(b); 如果在边缘部分求二阶导数会出现什么情况?,图(c)所示。(其图片和定义公式来源于http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.html)。

  

(a)                                                                                                          (b)

(c)

你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点。

为了更适合于数字图像处理,将该方程表示为离散形式:

另外,拉普拉斯算子还可以表示成模板的形式,以便更好编程需要。如图1所示。

图1(a)表示离散拉普拉斯算子的模板,图1(b)表示其扩展模板,图1(c)则分别表示其他两种拉普拉斯的实现模板。从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。一般增强技术对于陡峭的边缘和缓慢变化的边缘很难确定其边缘线的位置。但此算子却可用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理。

图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示:

这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息。但其缺点是对图像中的某些边缘产生双重响应。

    代码实现:

class LaplacianZC
{
public:

	LaplacianZC() :aperture(3){}
	// 设置内核孔径大小
	void setAperture(int a){
		aperture = a;
	}
	// 计算浮点类型的laplace算子
	cv::Mat computeLaplacian(const cv::Mat& image){
		cv::Laplacian(image, laplace, CV_32F, aperture);
		return laplace;
	}

	// 获取拉普拉斯结果,存在8为图像中
	cv::Mat getLaplacianImage(double scale = -1.0){
		if (scale < 0){
			double lapmin, lapmax;
			// 取得最小和最大拉普拉斯值
			cv::minMaxLoc(laplace, &lapmin, &lapmax);
			// 缩放拉普拉斯算子到127
			scale = 127 / std::max(-lapmin, lapmax);
		}

		// 生成灰度图像
		cv::Mat laplaceImage;
		laplace.convertTo(laplaceImage, CV_8U, scale, 128);
		return laplaceImage;

	}

private:
	//拉普拉斯算子
	cv::Mat laplace;
	// 拉普拉斯内核的孔径大小
	int aperture;

};


函数调用:
	LaplacianZC laplacian;
	laplacian.setAperture(7);  // 7*7的拉普拉斯算子
	cv::Mat flap = laplacian.computeLaplacian(img);
	cv::Mat laplace = laplacian.getLaplacianImage();

	namedWindow("raw");
	imshow("raw", img);
	namedWindow("laplace");
	imshow("laplace", laplace);

    效果图:

 

 

2. Canny算子检测图像轮廓

    原理:**

    代码实现:

// Canny算子检测图像轮廓
void canny(cv::Mat& img, cv::Mat& out) {
	// Convert to gray  
	if (img.channels() == 3)
		cv::cvtColor(img, out, CV_BGR2GRAY);
	// Compute Canny edges  
	cv::Canny(out, out, 100, 200);
	// Invert the image  
	cv::threshold(out, out, 128, 255, cv::THRESH_BINARY_INV);

	namedWindow("raw");
	imshow("raw", img);
	namedWindow("canny");
	imshow("canny", out);
}

 

 

 

 

 

 

 

 

© 著作权归作者所有

漫长当下TIME
粉丝 6
博文 63
码字总数 87069
作品 0
乌鲁木齐
高级程序员
私信 提问
【OpenCV入门指南】第三篇Canny边缘检测

【OpenCV入门指南】第三篇Canny边缘检测 图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。 Canny边缘检测算...

长平狐
2012/12/10
709
0
我为什么要写《OpenCV Android 开发实战》这本书

我为什么要写《OpenCV Android 开发实战》这本书 2015年我出版了个人第一本关于图像处理方面的书籍《Java图像处理-编程技巧与应用实践》,这本书主要是从理论与编码上面详细阐述了图像处理基...

gloomyfish
2018/07/06
0
0
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/89056240 该系列文章是讲解Python OpenCV图像处理知识,前...

Eastmount
04/06
0
0
7- OpenCV+TensorFlow 入门人工智能图像处理-彩色反转&边缘检测

彩色图像的颜色反转 不管是灰度图像的颜色反转,还是彩色颜色反转。都是255减去当前值 马赛克效果 理解马赛克效果中的关键指标 马赛克效果的窗体范围。如: 从100行开始到300行结束,列从100...

天涯明月笙
2018/05/06
0
0
[Python图像处理] 十七.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/89001702 该系列文章是讲解Python OpenCV图像处理知识,前...

Eastmount
04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS中实现图片垂直居中

在曾经的 淘宝UED 招聘 中有这样一道题目: “使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中。” 当然出题并不是随意,而是有其现实的原因,垂直居中...

前端老手
46分钟前
4
0
vue学习笔记5:vue富文本编辑器ueditor的组件封装及问题

做一个后台,离不开文本编辑器,百度的ueditor经常用,这次改用vue写后台,需要再次集成一下,遇到很多问题,搞了一下午,整理一下,希望能够帮到后来者。 目标: 希望封装的ueditor组件,尽...

Jack088
57分钟前
5
0
MFC多线程编程之四——线程的同步

八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成...

rainbowcode
今天
3
0
QWIDGET、QMAINWINDOW、QFRAME、QWINDOW、QDIALOG、QSCROLLAREA区别

QWindow一般不用 QDialog对话框而已 QScrollArea有滚动条的窗口。 from PyQt5.QtWidgets import (QWidget,QListWidget,QLabel,QApplication,QScrollArea,QFrame,QAction,QVBoxLayout,QLis......

shzwork
今天
3
0
CRM、DMP、CDP都是什么?有什么区别?

Markter对CRM系统(Customer Relationship Management System,客户关系管理系统),营销自动化等概念都已经比较熟悉,也许DMP(Data Management Platform,数据管理平台)也多多少少有些了解。...

怡海软件-CRM
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部