opencv 边缘检测(reberts,sobel,prewitt,kirsch)

经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。常用的边缘检测方法有Roberts算子、Sobe l算子、Prew itt算子、K irsch算子、Laplacian算子、LOG 算子、C anny算子等。

一、基于一阶微分的边缘检测方法

1、最简单的梯度算子是Roberts算子, 它是一个2 * 2模板, 利用局部差分检测比较陡峭的边缘, 但对于噪声较敏感, 经常会出现孤立点 。

//roberts算子求图像梯度提取边缘,输入源图像,输出梯度图,此方法不常用
void roberts(IplImage *src,IplImage *dst)
{
 //为roberts图像申请空间,因为要利用源图像指针中的imageData,因此使用复制方式
 dst=cvCloneImage(src);
 int x,y,i,w,h;
 int temp,temp1;

 uchar* ptr=(uchar*) (dst->imageData );
 int ptr1[4]={0};
 int indexx[4]={0,1,1,0};
 int indexy[4]={0,0,1,1};
    w=dst->width;
 h=dst->height;
 for(y=0;y<h-1;y++)
  for(x=0;x<w-1;x++)
  {

   for(i=0;i<4;i++)    //取每个2*2矩阵元素的指针      0 | 1
   {                   //                             3 | 2
    ptr1[i]= *(ptr+(y+indexy[i])*dst->widthStep+x+indexx[i]);
    
   }
   temp=abs(ptr1[0]-ptr1[2]);    //计算2*2矩阵中0和2位置的差,取绝对值temp
   temp1=abs(ptr1[1]-ptr1[3]);   //计算2*2矩阵中1和3位置的差,取绝对值temp1
   temp=(temp>temp1?temp:temp1); //若temp1>temp,则以temp1的值替换temp
      temp= (int)sqrt(float(temp*temp)+float(temp1*temp1));  //输出值
  /* if (temp>100)
    temp=255;
   else temp=0;  */
   *(ptr+y*dst->widthStep+x)=temp;    //将输出值存放于dst像素的对应位置
  }

 double min_val = 0,max_val = 0;//取图并显示像中的最大最小像素值
 cvMinMaxLoc
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值