OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)
收入囊中
- 拉普拉斯算子
- LOG算子(高斯拉普拉斯算子)
- OpenCV Laplacian函数
- 构建自己的拉普拉斯算子
- 利用拉普拉斯算子进行图像的锐化
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjZDE5OTI3MTln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="600" height="500" alt="">上面是一阶导数。以下是二阶导数

|
|
| 图5-9 拉普拉斯的4种模板 |
拉普拉斯算子会放大噪声,因此我们採用了LOG算子,就是高斯拉普拉斯算子,先对图像进行高斯模糊。抑制噪声,再求二阶导数。二阶导数为0的地方就是图像的边界。
-
C++: void Laplacian(InputArray src,
OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
-
- src – Source image.
- dst – Destination image of the same size and the same number of channels as src .
- ddepth – Desired depth of the destination image.
- ksize – Aperture size used to compute the second-derivative filters. See getDerivKernels() for
details. The size must be positive and odd. - scale – Optional scale factor for the computed Laplacian values. By default, no scaling is applied. See getDerivKernels() for
details. - delta – Optional delta value that is added to the results prior to storing them in dst .
- borderType – Pixel extrapolation method. See borderInterpolate() for
details.
This is done when ksize > 1 . When ksize == 1 ,
the Laplacian is computed by filtering the image with the following
aperture:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp" using namespace cv; int main( int, char** argv )
{ Mat src, src_gray;
int kernel_size = 3;
const char* window_name = "Laplace Demo"; src = imread( argv[1] );
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
cvtColor( src, src_gray, CV_RGB2GRAY );
namedWindow( window_name, CV_WINDOW_AUTOSIZE ); Mat dst, abs_dst;
Laplacian( src_gray, dst, CV_16S, kernel_size);
convertScaleAbs( dst, abs_dst ); imshow( window_name, abs_dst );
waitKey(0);
return 0;
}
效果图:
| 1 | 1 | 1 |
| 1 | -8 | 1 |
| 1 | 1 | 1 |
这样的形式的算子,代码例如以下
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv; int main( int, char** argv )
{
Mat src,gray,Kernel; src = imread( argv[1] );
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
cvtColor( src, gray, CV_RGB2GRAY );
namedWindow("dstImage", 1); Kernel = (Mat_<double>(3,3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);
Mat grad,abs_grad;
filter2D(gray, grad, CV_16S , Kernel, Point(-1,-1));
convertScaleAbs( grad, abs_grad ); imshow("dstImage", abs_grad);
waitKey();
return 0;
}
效果图就不发了,跟上面差点儿相同
拉普拉斯锐化的基本方法能够由下式表示:
![]() |
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv; int main( int, char** argv )
{
Mat src,gray; src = imread( argv[1] );
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
cvtColor( src, gray, CV_RGB2GRAY );
namedWindow("srcImage", 1);
namedWindow("dstImage", 1); Mat grad,abs_grad;
Laplacian( gray, grad, CV_16S, 3);
convertScaleAbs( grad, abs_grad );
Mat sharpped = gray + abs_grad; imshow("srcImage", gray);
imshow("dstImage", sharpped);
waitKey();
return 0;
}
效果图:
OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)的更多相关文章
- OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...
- OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...
- openCV2马拉松第19圈——Harris角点检測(自己实现)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...
- OpenCV图像处理篇之边缘检測算子
3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于 ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- 图像边缘检測--OpenCV之cvCanny函数
图像边缘检測--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...
- Canny边缘检測算法原理及其VC实现具体解释(一)
图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般能够看作是一个阶跃,既从一个灰度值在非常小的缓冲区域内急剧变化到还有一个灰度相差较大的灰度值.图象的边缘部分集中了图象的大部分信息,图 ...
- Python图像处理(8):边缘检測
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 此前已经得到了单个区域植株图像,接下来似乎应该尝试对这些区域进行分类识别.通过外形和叶脉进行植物种 ...
- 图像处理之Canny边缘检測
图像处理之Canny 边缘检測 一:历史 Canny边缘检測算法是1986年有John F. Canny开发出来一种基于图像梯度计算的边缘 检測算法,同一时候Canny本人对计算图像边缘提取学科的发展 ...
随机推荐
- 子Repeater获取父级Repeater绑定项的值
原文发布时间为:2010-12-27 -- 来源于本人的百度文章 [由搬家工具导入] 1.子级Repeater中绑定父级的某个字段: <%# DataBinder.Eval((Container ...
- Spring Boot学习——第一个Spring Boot程序
依照下面的步骤创建项目: 点击 Next 项目介绍: Application.java中的主要代码: @SpringBootApplication public class ReaderApplica ...
- 任意选若干个不相邻的数得到的和最大【dp】
非相邻数最大和 ///*任意选若干个不相邻的数得到的和最大*/ #include<cstdio> #include<cstring> #include<queue> ...
- 2016北京集训测试赛(十四)Problem A: 股神小L
Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...
- Storage protocol stacks
http://brasstacksblog.typepad.com/brass-tacks/ http://brasstacksblog.typepad.com/brass-tacks/2016/02 ...
- 转: 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
from: https://github.com/RubyLouvre/agate/issues/8 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以 ...
- C#数据之DataTable
C#创建DataTable的几种方式 第一种方式:直接添加数据对象 DataTable table = new DataTable(); table.Columns.Add("strName ...
- AutoCAD如何输入文字
1 运行文字命令(这里使用单行文字),然后鼠标点击文字的起始点,如图所示 2 鼠标分别向上和向右移动一定距离,表示文字的高度(文字的大小)和文字的旋转角度(一般向右,因为是水平文字) 3 最后 ...
- 我用select做多路复用踩到的坑
既然说是用select踩到的坑,那么就先直接贴一段使用select的代码上来瞅一下: bool SocketAction(int fd, const char* buf, size_t len, ui ...
- linux 木马
参考 http://wangzan18.blog.51cto.com/8021085/1740113 http://www.cnblogs.com/jluzhsai/p/3756280.html ( ...
