欢迎来到天天文库
浏览记录
ID:56907499
大小:29.50 KB
页数:7页
时间:2020-07-23
《opencv实现c++的otsu自适应阈值分割的算法描述.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果算法具体描述见otsu论文,或冈萨雷斯著名的数字图像处理那本书这里给出程序流程:1、计算直方图并归一化histogram2、计算图像灰度均值avgValue.3、计算直方图的零阶w[i]和一级矩u[i]4、计算并找到最大的类间方差(between-classvariance)variance[i]=(avgValue*w[i]-u[i])*(avgValue*w[i]-u[i])/(w[i]*(1-w[i]))对应此最大方差的灰度值即为要找的阈值5、用找到的阈值二值化图像我在代码中做了一些优化,所以
2、算法描述的某些地方跟程序并不一致otsu代码,先找阈值,继而二值化//implementationofotsualgorithm//author:onezeros(@yahoo.cn)//reference:RafaelC.Gonzalez.DigitalImageProcessingUsingMATLABvoidcvThresholdOtsu(IplImage*src,IplImage*dst){intheight=src->height;intwidth=src->width;//histogramfloathistogram[256]={0};for(
3、inti=0;iimageData+src->widthStep*i;for(intj=0;j4、Value+=i*histogram[i];}intthreshold;floatmaxVariance=0;floatw=0,u=0;for(inti=0;i<256;i++){w+=histogram[i];u+=i*histogram[i];floatt=avgValue*w-u;floatvariance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY5、);}更多情况下我们并不需要对每一帧都是用otsu寻找阈值,于是可以先找到阈值,然后用找到的阈值处理后面的图像。下面这个函数重载了上面的,返回值就是阈值。只做了一点改变//implementationofotsualgorithm//author:onezeros(@yahoo.cn)//reference:RafaelC.Gonzalez.DigitalImageProcessingUsingMATLABintcvThresholdOtsu(IplImage*src){intheight=src->height;intwidth=src->width;//6、histogramfloathistogram[256]={0};for(inti=0;iimageData+src->widthStep*i;for(intj=0;j7、tavgValue=0;for(inti=0;i<256;i++){avgValue+=i*histogram[i];}intthreshold;floatmaxVariance=0;floatw=0,u=0;for(inti=0;i<256;i++){w+=histogram[i];u+=i*histogram[i];floatt=avgValue*w-u;floatvariance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}returnthresho8、ld;}我在手的自动检测中使用这个方法,效果很好。下
4、Value+=i*histogram[i];}intthreshold;floatmaxVariance=0;floatw=0,u=0;for(inti=0;i<256;i++){w+=histogram[i];u+=i*histogram[i];floatt=avgValue*w-u;floatvariance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY
5、);}更多情况下我们并不需要对每一帧都是用otsu寻找阈值,于是可以先找到阈值,然后用找到的阈值处理后面的图像。下面这个函数重载了上面的,返回值就是阈值。只做了一点改变//implementationofotsualgorithm//author:onezeros(@yahoo.cn)//reference:RafaelC.Gonzalez.DigitalImageProcessingUsingMATLABintcvThresholdOtsu(IplImage*src){intheight=src->height;intwidth=src->width;//
6、histogramfloathistogram[256]={0};for(inti=0;iimageData+src->widthStep*i;for(intj=0;j7、tavgValue=0;for(inti=0;i<256;i++){avgValue+=i*histogram[i];}intthreshold;floatmaxVariance=0;floatw=0,u=0;for(inti=0;i<256;i++){w+=histogram[i];u+=i*histogram[i];floatt=avgValue*w-u;floatvariance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}returnthresho8、ld;}我在手的自动检测中使用这个方法,效果很好。下
7、tavgValue=0;for(inti=0;i<256;i++){avgValue+=i*histogram[i];}intthreshold;floatmaxVariance=0;floatw=0,u=0;for(inti=0;i<256;i++){w+=histogram[i];u+=i*histogram[i];floatt=avgValue*w-u;floatvariance=t*t/(w*(1-w));if(variance>maxVariance){maxVariance=variance;threshold=i;}}returnthresho
8、ld;}我在手的自动检测中使用这个方法,效果很好。下
此文档下载收益归作者所有