Opencv笔记分享---大津(otsu)的使用代码
2012-01-01 21:51
411 查看
目的:
在opencv工程里面使用otsu分割灰度图像类似于matlab里的graythresh, opencv里面提供了otsu threshold的源代码“icvGetThreshVal_Otsu”,但是我们却不能直接调用它,只能把它拷贝出来使用(这就是开源的好处),下面代码是我在opencv工程应用当中应用otsu(大津法)的例子
在opencv工程里面使用otsu分割灰度图像类似于matlab里的graythresh, opencv里面提供了otsu threshold的源代码“icvGetThreshVal_Otsu”,但是我们却不能直接调用它,只能把它拷贝出来使用(这就是开源的好处),下面代码是我在opencv工程应用当中应用otsu(大津法)的例子
//Input: //pTile_pic: 灰度图像,*IplImage //output: //im_th: pTile_pic 的otsu阈值 //otsu threshold: int size = 256; float range[] = {0, 255}; float *pRange[] = {&range[0]}; CvHistogram *p_imhist = cvCreateHist(1, &size, CV_HIST_ARRAY, pRange); cvCalcHist(&pTile_pic, p_imhist); double im_th = icvGetThreshVal_Otsu(p_imhist); //opencv Source code: static double icvGetThreshVal_Otsu( const CvHistogram* hist ) { double max_val = 0; CV_FUNCNAME( "icvGetThreshVal_Otsu" ); __BEGIN__; int i, count; const float* h; double sum = 0, mu = 0; bool uniform = false; double low = 0, high = 0, delta = 0; float* nu_thresh = 0; double mu1 = 0, q1 = 0; double max_sigma = 0; if( !CV_IS_HIST(hist) || CV_IS_SPARSE_HIST(hist) || hist->mat.dims != 1 ) CV_ERROR( CV_StsBadArg, "The histogram in Otsu method must be a valid dense 1D histogram" ); count = hist->mat.dim[0].size; h = (float*)cvPtr1D( hist->bins, 0 ); if( !CV_HIST_HAS_RANGES(hist) || CV_IS_UNIFORM_HIST(hist) ) { if( CV_HIST_HAS_RANGES(hist) ) { low = hist->thresh[0][0]; high = hist->thresh[0][1]; } else { low = 0; high = count; } delta = (high-low)/count; low += delta*0.5; uniform = true; } else nu_thresh = hist->thresh2[0]; for( i = 0; i < count; i++ ) { sum += h; if( uniform ) mu += (i*delta + low)*h; else mu += (nu_thresh[i*2] + nu_thresh[i*2+1])*0.5*h; } sum = fabs(sum) > FLT_EPSILON ? 1./sum : 0; mu *= sum; mu1 = 0; q1 = 0; for( i = 0; i < count; i++ ) { double p_i, q2, mu2, val_i, sigma; p_i = h*sum; mu1 *= q1; q1 += p_i; q2 = 1. - q1; if( MIN(q1,q2) < FLT_EPSILON || MAX(q1,q2) > 1. - FLT_EPSILON ) continue; if( uniform ) val_i = i*delta + low; else val_i = (nu_thresh[i*2] + nu_thresh[i*2+1])*0.5; mu1 = (mu1 + val_i*p_i)/q1; mu2 = (mu - q1*mu1)/q2; sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2); if( sigma > max_sigma ) { max_sigma = sigma; max_val = val_i; } } __END__; return max_val; }
相关文章推荐
- Opencv大津(otsu)的使用代码
- 13、新手入手树莓派教程--Qt中使用wiringPi来驱动RGB灯、使用opencv打开网络摄像头(代码分享)
- 【分享笔记】使用lint来改善你的代码
- 12、新手入手树莓派教程--Qt中使用wiringPi来驱动RGB灯、使用opencv打开摄像头(代码分享)
- 使用对象流读写对象代码笔记(ObjectInputStream ,ObjectOutputStream)
- OpenCV 人脸检测自学笔记(8)_读trainCascade的训练结果的代码笔记
- VS+OpenCV使用自带samples代码时,main函数参数为int argc,char*argv的问题
- 【个人笔记重点,不作为参考】主题:Mac OSX下Sublime Text配置使用Ctags实现代码跳转
- opencv颜色识别代码分享
- php生成缩略图示例代码分享(使用gd库实现)
- OpenCV学习笔记(15)使用OpenGL显示双目视觉三维重构效果 (转)
- 基础学习笔记之opencv(4):直方图使用学习
- 《Effective Java 第二版》学习笔记,第23条:请不要在新代码中使用原生态类型
- C#如何不使用递归实现无限层次结构的代码分享[转]
- [置顶] 完整VS2010中使用MFC+Opencv设计视频读取(有代码和相关解析)
- opencvdll在unity3d 中如何使用的代码
- 笔记:使用 opencv 获取两幅图片的相位偏移
- 【ZYNQ_LINUX】使用ubuntu 编译opencv 代码
- 学习lua笔记分享(三)--C#远程加载lua代码
- [置顶] PHP语言代码漏洞审计技巧笔记分享