前一段时间做一个项目时,首先用matlab做边缘检测看检测结果,之后有用OPENCV中自带的Sobel边缘检测函数测试,发现和matlab检测的结果差距较大,于是自己实现了一个Sobel边缘检测程序;
void mysobel(IplImage* src,IplImage* dst,int threshold)
{
/* cvCvtColor(src,dst,CV_RGB2GRAY);*/
int w=src->width;
int h=src->height;
int step=src->widthStep;
uchar* p=(uchar*)src->imageData;
uchar* q=(uchar*)dst->imageData;
int p1,p2,p3,p4,p5,p6,p7,p8,p9;
double m,n;
for(int f=0;f<h-2;f++)
{
for(int k=0;k<w-2;k++)
{
p1=p[f*step+k];
p2=p[f*step+(k+1)];
p3=p[f*step+(k+2)];
p4=p[(f+1)*step+k];
p5=p[(f+1)*step+(k+1)];
p6=p[(f+1)*step+(k+2)];
p7=p[(f+2)*step+k];
p8=p[(f+2)*step+(k+1)];
p9=p[(f+2)*step+(k+2)];//得到(i+1,j+1)周围九个点的灰度值
m=fabs(double(p3+2*p6+p9-p1-2*p4-p7));
//n=fabs(double(p7+2*p8+p9-p1-2*p2-p3));//应用sobel算子做差分,得到(i+1,j+1)点的微分值
// if(sqrt(m*m+n*n)<threshold)//设定阈值(即梯度大小)以检测是否为一阶导数的极大值点,即边缘点
// {
// q[(f+1)*step+(k+1)]=0;
// }
if (m<threshold) //只做垂直方向边缘检测
{
q[(f+1)*step+(k+1)]=0;
}
else
{
q[(f+1)*step+(k+1)]=255;
}
}
}
return;
}