文档章节

在OpenCV中自适应确定canny算法的分割门限

我是一只鱼
 我是一只鱼
发布于 2011/12/13 12:00
字数 459
阅读 1357
收藏 1
 在OpenCV中用canny算子进行边缘检测速度很快,不过有点不爽的就是高低阈值需要输入。在matlab中,如果不指定阈值的话,由函数自适应确定,因此仿照matlab中的做法,对canny函数进行了修改,以便当用户没有指定高低阈值时,由函数自适应确定阈值。
  我在OpenCv原码库中增加了一个函数,用于确定高低阈值。
// 仿照matlab,自适应求高低两个门限
CV_IMPL void AdaptiveFindThreshold(CvMat *dx, CvMat *dy, double *low, double *high)
{
 CvSize size;
 IplImage *imge=0;
 int i,j;
 CvHistogram *hist;
 int hist_size = 255;
    float range_0[]={0,256};
    float* ranges[] = { range_0 };
 double  PercentOfPixelsNotEdges = 0.7;
 size = cvGetSize(dx);
 imge = cvCreateImage(size, IPL_DEPTH_32F, 1);
 // 计算边缘的强度, 并存于图像中
 float maxv = 0;
 for(i = 0; i < size.height; i++ )
 {
  const short* _dx = (short*)(dx->data.ptr + dx->step*i);
        const short* _dy = (short*)(dy->data.ptr + dy->step*i);
  float* _image = (float *)(imge->imageData + imge->widthStep*i);
  for(j = 0; j < size.width; j++)
  {
   _image[j] = (float)(abs(_dx[j]) + abs(_dy[j]));
   maxv = maxv < _image[j] ? _image[j]: maxv;
  }
 }
 
 // 计算直方图
 range_0[1] = maxv;
 hist_size = (int)(hist_size > maxv ? maxv:hist_size);
 hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
 cvCalcHist( &imge, hist, 0, NULL );
 int total = (int)(size.height * size.width * PercentOfPixelsNotEdges);
 float sum=0;
 int icount = hist->mat.dim[0].size;
 
 float *h = (float*)cvPtr1D( hist->bins, 0 );
 for(i = 0; i < icount; i++)
 {
  sum += h[i];
  if( sum > total )
   break; 
 }
// 计算高低门限
 *high = (i+1) * maxv / hist_size ;
 *low = *high * 0.4;
 cvReleaseImage( &imge );
 cvReleaseHist(&hist);
}
 
在把cvCanny函数进行以下修改。
在函数体中,当程序用两个sobel算子计算完水平和垂直两个方向的梯度强度过后加入以下代码
// 自适应确定阈值
 if(low_thresh == -1 && high_thresh == -1)
 {
  AdaptiveFindThreshold(dx, dy, &low_thresh, &high_thresh);
 }
 
这样,在调用cvCanny函数时,指定高低门限为-1,则cvCanny函数就自适应确定门限。
 
最后,别忘了重新编译cv库,对lib和dll库进行更新。
that's all!

© 著作权归作者所有

共有 人打赏支持
我是一只鱼
粉丝 15
博文 52
码字总数 12739
作品 0
长沙
程序员
私信 提问
使用Numpy和Opencv完成图像的基本数据分析(Part IV)

图像 本文是使用python进行图像基本处理系列的第四部分,在本人之前的文章里介绍了一些非常基本的图像分析操作,见文章《使用Numpy和Opencv完成图像的基本数据分析Part I》、《使用Numpy和O...

【方向】
10/10
0
0
opencv动态边缘检测-python

OpenCV:是一个基于BSD许可(开源)发行的跨平台计算视觉库。由一系列C函数和少量的C++编写,实现图像处理和计算机视觉方面的很多通用算法。 Canny边缘检测算子:是一种多级检测算法。1986年...

yan_shichang
04/24
0
0
我为什么要写《OpenCV Android 开发实战》这本书

我为什么要写《OpenCV Android 开发实战》这本书 2015年我出版了个人第一本关于图像处理方面的书籍《Java图像处理-编程技巧与应用实践》,这本书主要是从理论与编码上面详细阐述了图像处理基...

gloomyfish
07/06
0
0
OpenCV4Android+JNI开发快速上手入门

最近尝试了一下在Android上试验简单的一些OpenCV算法,发现OpenCV4Android SDK非常好用,提供大部分常用的OpenCV功能的Java API。当然如果直接对图像像素进行操作的话Java会比较没有效率,这...

bli
2013/12/02
0
2
opencv入门12:梯度和边缘检测-GRADIENTS AND EDGE DETECTION

一、图像梯度: 图像梯度,图像边界等 使用到的函数有:cv2.Sobel(),cv2.Schar(),cv2.Laplacian() 等 cv2.THRESH_TRUNC cv2.THRESH_TOZERO cv2.THRESHTOZEROINV 梯度简单来说就是求导。 Op...

HaveyYeung
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
24分钟前
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
42分钟前
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
今天
1
0
【分享实录】BANCOR算法详解及代码实现

1 活动基本信息 1)主题:【区块链技术工坊22期】BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何开发自己的BANCOR去中心...

HiBlock
今天
2
0
微信小程序(2)

开始看微信小程序的教程了。刚刚看完官方教程的视图层部分。这里摘录一些自己认为的部分关键点。 1.直接修改数值无法重新渲染,需要使用setData()方法; 2.列表渲染中:wx:key用于保持项目在...

MKjy
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部