opencv边缘检测(robert,prewitt,sobel,canny,laplacian)

常用的边缘检测都是用图像中小的领域来构造边缘检测算子,常用的方法有robert,prewitt,sobel,canny,laplacian。

1.robert使用局部差分检测比较陡峭的边缘,对噪声敏感。

Mat robert(Mat imageP)
{
	Mat resultImage;
	Mat temp=imageP;
	cvtColor(imageP,temp,CV_RGB2GRAY);
	resultImage=temp;
	
	for(int i=0;i<temp.rows-1;i++)
	{
		for(int j=0;j<temp.cols-1;j++)
		{
			resultImage.at<uchar>(i,j)=sqrt((temp.at<uchar>(i,j)-temp.at<uchar>(i+1,j+1))*(temp.at<uchar>(i,j)-temp.at<uchar>(i+1,j+1))+(temp.at<uchar>(i,j+1)-temp.at<uchar>(i+1,j))*(temp.at<uchar>(i,j+1)-temp.at<uchar>(i+1,j)));


		}
	}
	return resultImage;
}


2. Prewitt算子和Sobe l算子。这两种算子在求梯度之前, 首先进行邻域平均或加权平均, 然后进行微分, 就抑制了噪声, 但容易出现边缘模糊现象。

Mat prewitt(Mat imageP)
{
	cvtColor(imageP,imageP,CV_RGB2GRAY);
	float prewittx[9] =           
	{  
		-1,0,1,  
		-1,0,1,  
		-1,0,1  
	};  
	float prewitty[9] =   
	{  
		1,1,1,  
		0,0,0,  
		-1,-1,-1  
	};  
	Mat px=Mat(3,3,CV_32F,prewittx);
	Mat py=Mat(3,3,CV_32F,prewitty);
	Mat dstx=Mat(imageP.size(),imageP.type(),imageP.channels());
    Mat dsty=Mat(imageP.size(),imageP.type(),imageP.channels());
	Mat dst=Mat(imageP.size(),imageP.type(),imageP.channels());
	filter2D(imageP,dstx,imageP.depth(),px);
	filter2D(imageP,dsty,imageP.depth(),py);
	float tempx,tempy,temp;
	for(int i=0;i<imageP.rows;i++)
	{
		for(int j=0;j<imageP.cols;j++)
		{
			tempx=dstx.at<uchar>(i,j);
			tempy=dsty.at<uchar>(i,j);
			temp=sqrt(tempx*tempx+tempy*tempy);
			dst.at<uchar>(i,j)=temp;
		}
	}
	return dst;
}


Mat mySobel(Mat imageP)
{
	Mat resultImage=imageP;
	cvtColor(imageP,resultImage,CV_RGB2GRAY);
	Mat H=resultImage,V=resultImage,HV=resultImage;
	Sobel(resultImage,H,resultImage.depth(),0,1);
	Sobel(resultImage,V,resultImage.depth(),1,0);
	for(int i=0;i<imageP.rows;i++)
	{
		for(int j=0;j<imageP.cols;j++)
		{
			HV.at<uchar>(i,j)=sqrt(H.at<uchar>(i,j)*H.at<uchar>(i,j)+V.at<uchar>(i,j)*V.at<uchar>(i,j));
		}
	}
	normalize(HV,HV,255,0,CV_MINMAX);
	return HV;
}


3.laplace

二维函数f(x,y)的拉普拉斯是一个二阶的微分,定义为:

其中:

可以用多种方式将其表示为数字形式。对于一个3*3的区域,经验上被推荐最多的形式是:

定义数字形式的拉普拉斯要求系数之和必为0


Mat laplacian(int sizeKernel,Mat imageP)
{
	Mat resultImage,abs_resultImage,resultImage2;
	Laplacian(imageP,resultImage,imageP.depth(),sizeKernel,1,0,BORDER_DEFAULT);
	convertScaleAbs(resultImage,abs_resultImage);
	subtract(imageP,resultImage,resultImage2);
        return resultImage;
	}



4.canny算子

Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子。

Mat myCanny(Mat imageP)
{
	Mat resultImage=imageP;
	cvtColor(imageP,resultImage,CV_RGB2GRAY);
	
	Canny(imageP,resultImage,0,100,3);
	return resultImage;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值