文档介绍:1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。
1. OTSU算法原理简介
对于一幅图像,设当前景与背景的分割阈值为t时,前景点占图像比例为wO,均值 为uO,背景点占图像比例为w1,均值为u1。则整个图像的均值为u = w0*u0+w1*u1。建 立目标函数g(t)=wO*(uO-u)A2+w1*(u1-u)A2, g(t)就是当分割阈值为t时的类间方差表达式。 OTSU算法使得g(t)取得全局最大值,当g(t)为最大时所对应的t称为最佳阈值。OTSU算 法又称为最大类间方差法。
下面是OSTU算法的C语言代码及其测试,代码基于opencv。
[cpp] view plaincopy
#include <>
#include <>
int otsu(IplImage *image)
{
assert(NULL != image);
int width = image->width;
int height = image->height;
int x=0,y=0;
int pixelCount[256];
float pixelPro[256];
int i, j, pixelSum = width * height, threshold = 0;
uchar* data = (uchar*)image->imageData;
//初始化
for(i = 0; i < 256; i++)
{
pixelCount[i] = 0; pixelPro[i] = 0;
}
//统计灰度级中每个像素在整幅图像中的个数
for(i = y; i < height; i++)
{
for(j = x;j <width;j++)
{
pixelCount[data[i * image->widthStep + j]]++; }
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
//计算每个像素在整幅图像中的比例
for(i = 0; i < 256; i++)
{
pixelPro[i] = (float)(pi