OTSU算法提取图像阈值的C语言实现[转载】
2011-03-28 09:40
549 查看
作者:Steven Wang
网址:http://blog.stevenwang.name/ostu-threshold-56002.html
OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字
图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部
分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
设灰度图像灰度级是L,则灰度范围为[0,L-1],利用OTSU算法计算图像的最佳阈值为:
t = Max[w0(t) * (u0(t) - u)^2 + w1(t) * (u1(t) - u)^2)]
其中的变量说明:当分割的阈值为t时,w0为背景比例,u0为背景均值,w1为前景比例,u1为前景均值,u为整幅图像的均值。
使以上表达式值最大的t,即为分割图像的最佳阈值。
以下是一段在OpenCV
中实现的C语言程序,即一个使用OTSU算法提取图像阈值的函数,输入参数为一个图像指针,返回分割该图像的最佳阈值
int otsuThreshold(IplImage *frame) { int width = frame->width; int height = frame->height; int pixelCount[GrayScale]; float pixelPro[GrayScale]; int i, j, pixelSum = width * height, threshold = 0; uchar* data = (uchar*)frame->imageData; for(i = 0; i < GrayScale; i++) 4000 { pixelCount[i] = 0; pixelPro[i] = 0; } //统计灰度级中每个像素在整幅图像中的个数 for(i = 0; i < height; i++) { for(j = 0;j < width;j++) { pixelCount[(int)data[i * width + j]]++; } } //计算每个像素在整幅图像中的比例 for(i = 0; i < GrayScale; i++) { pixelPro[i] = (float)pixelCount[i] / pixelSum; } //遍历灰度级[0,255] float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0; for(i = 0; i < GrayScale; i++) { w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0; for(j = 0; j < GrayScale; j++) { if(j <= i) //背景部分 { w0 += pixelPro[j]; u0tmp += j * pixelPro[j]; } else //前景部分 { w1 += pixelPro[j]; u1tmp += j * pixelPro[j]; } } u0 = u0tmp / w0; u1 = u1tmp / w1; u = u0tmp + u1tmp; deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2); if(deltaTmp > deltaMax) { deltaMax = deltaTmp; threshold = i; } } return threshold; }
相关文章推荐
- OTSU算法提取图像阈值的C语言实现
- OTSU算法提取图像阈值的C语言实现
- OTSU算法提取图像阈值的C语言实现
- VLFeat——SIFT图像特征提取(VC++实现)【转载】
- (转载)利用C语言实现计算机图像处理的方法
- VLFeat——SIFT图像特征提取(VC++实现)【转载】
- 转载:数字图像去噪典型算法及matlab实现 (http://gaochaojs.blog.51cto.com/812546/243961)
- 目标检测的图像特征提取之(一)HOG特征(转载)
- 利用C语言实现计算机图像处理的方法
- C语言实现BMP图像的写入与图像的清空(256色灰度图)
- 基于JAVA的水泥三维图像特征提取系统设计与实现 之一 JAVA 3D学习笔记
- 快速幂(C语言实现) 超详细 (转载)
- 碎片图像无缝拼合技术的VC++实现(转载)
- python实现LBP方法提取图像纹理特征实现分类
- 基于直方图的图像全局二值化算法原理、实现--基于谷底最小值的阈值
- 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)
- java 使用tess4j实现图像文字提取 eclipse的配置
- 光场子孔径图像提取(C++实现)
- (转载)C语言单链表实现19个功能完全详解
- 转载:请教:c#中实现图像缩放?