常用的边缘检测都是用图像中小的领域来构造边缘检测算子,常用的方法有robert,prewitt,sobel,canny,laplacian。
1.robert使用局部差分检测比较陡峭的边缘,对噪声敏感。
2. Prewitt算子和Sobe l算子。这两种算子在求梯度之前, 首先进行邻域平均或加权平均, 然后进行微分, 就抑制了噪声, 但容易出现边缘模糊现象。Mat robert(Mat imageP) { Mat resultImage; Mat temp=imageP; cvtColor(imageP,temp,CV_RGB2GRAY); resultImage=temp; for(int i=0;i
(i,j)=sqrt((temp.at (i,j)-temp.at (i+1,j+1))*(temp.at (i,j)-temp.at (i+1,j+1))+(temp.at (i,j+1)-temp.at (i+1,j))*(temp.at (i,j+1)-temp.at (i+1,j))); } } return resultImage; }
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
(i,j); tempy=dsty.at (i,j); temp=sqrt(tempx*tempx+tempy*tempy); dst.at (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
(i,j)=sqrt(H.at (i,j)*H.at (i,j)+V.at (i,j)*V.at (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; }
Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子。
Mat myCanny(Mat imageP) { Mat resultImage=imageP; cvtColor(imageP,resultImage,CV_RGB2GRAY); Canny(imageP,resultImage,0,100,3); return resultImage; }