opencv拉普拉斯边缘锐化cvLaplace算法的运用

来源:互联网 发布:java 修改final变量 编辑:程序博客网 时间:2024/05/16 04:54

Laplacian变换

Laplacian 算子是n维欧几里得空间中的一个二阶微分算子,定义为梯度grad()的散度div()。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义为:

(1) f的拉普拉斯算子也是笛卡尔坐标系xi中的所有非混合二阶偏导数求和


(2) 作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数,对于k ≥ 2。表达式(1)(或(2))定义了一个算子Δ : C(R) → C(R),或更一般地,定义了一个算子Δ : C(Ω) → C(Ω),对于任何开集Ω。

对于阶跃状边缘,魂不附体导数在边缘点出现零交叉,即边缘点两旁二阶导数取异号。据此,对数字图像{f(i,j)}的每个像素,取它关于x轴方向和y轴方向的二阶差分之和,表示为:


函数的拉普拉斯算子也是该函数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。如果邻域系统是4 邻域,Laplacian 算子的模板为:


如果邻域系统是8 邻域,Laplacian 算子的模板为:


前面提过,Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。


算子要求所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。可以用函数 cvConvertScale 或 cvConvertScaleAbs 把运算结果(dst)转换为 8 位的



void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 );

src  输入图像

dst  输出图像

aperture_size  核大小(和sobel一样)


本实验通过摄像头来拍摄图片,直接进行边缘锐化。

代码:

#include<cv.h>
#include<highgui.h>
#include<stdio.h>
#include<malloc.h>
///#pragma comment(lib,"cv.lib")
//#pragma comment(lib,"cxcore.lib")
//#pragma comment(lib,"highgui.lib")
//#pragma comment(lib,"cvaux.lib")


int main(int argc,char**argv)
{
CvCapture* capture=NULL;
IplImage* frame =NULL;
IplImage* laplace=NULL;//拉普拉斯转换后的单通道图像
IplImage * ColorImage = NULL;//用于显示最终转换后的图像
capture = cvCaptureFromCAM(-1);
if(!capture)
{
fprintf(stderr,"未发现摄像头");
return 1;
}


cvNamedWindow("Laplace",1);
IplImage *panel[3];//三个通道
while(true)
{
frame = cvQueryFrame(capture);
if(!frame)
{
break;
}
if(!laplace) //创建需要创建的变量
{
for(int i=0;i<3;i++)
panel[i] = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);
laplace = cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);
ColorImage = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
}
cvSplit(frame,panel[0],panel[1],panel[2],NULL); //分割图像到单通道
for(int i=0;i<3;i++)
{
cvLaplace(panel[i],laplace,3);  //每一个通道做拉普拉斯变换
cvConvertScaleAbs(laplace,panel[i],1,0); //做类型转换,转换到8U
}
cvMerge(panel[0],panel[1],panel[2],NULL,ColorImage);//合并图像通道
ColorImage->origin = 0;//0--正面对摄像头;1--倒过来对摄像头
cvShowImage("Laplace",ColorImage);
cvWaitKey(10);
}
return 0;
}


效果:

没错!你看到的就是我!背景是我们的秘密实验室。





0 0
原创粉丝点击