最大类间算法OSTU源码
最大类间算法是求取一个阈值,将图像分为两部分后,这两部分的像素平均值的方差最大。计算过程如下:设u1为第一部分的均值,u2第二部分的均值,w1为第一部分的像素所占的比例,w2为第一部分的像素所占的比例,即w1+w2=1;则这两部分的方差为var=w1* w2* (u1-u2)*(u1-u2)C++ 源代码如下int GetOSTUthresd(Mat input){int row...
·
最大类间算法是求取一个阈值,将图像分为两部分后,这两部分的像素平均值的方差最大。计算过程如下:
设u1为第一部分的均值,u2第二部分的均值,w1为第一部分的像素所占的比例,w2为第一部分的像素所占的比例,即w1+w2=1;
则这两部分的方差为var=w1* w2* (u1-u2)*(u1-u2)
C++ 源代码如下
int GetOSTUthresd(Mat input)
{
int rows = input.rows;
int cols = input.cols;
long size = rows*cols;
float histogram[256] = {0};
int threshold = 0;
for (int i = 0; i < rows; ++i)
{
///获取i行首像素的指针
const uchar *p = input.ptr<uchar>(i);
///遍历i行像素
for (int j = 0; j < cols; ++j)
{
//cout << int(*p++) << endl;
histogram[int(*p++)]++;
}
}
long sum0 = 0; ///0到i级的像素值总和
long sum1 = 0;///i到255级的像素值总和
long cnt0 = 0;///0到i级的像素总数
long cnt1 = 0;///i到255的像素总数
double w0 = 0;///0到i级的像素所占比例
double w1 = 0;///i到255的像素所占比例
double u0 = 0;///0到i级的灰度均值
double u1 = 0; ///i到255级的灰度均值
double u;///整幅图像的灰度均值
double variance = 0;///方差
double max_varience = 0;
for (int i = 1; i < 256; i++)
{
sum0 = 0; sum1 = 0; cnt0 = 0; cnt1 = 0; w0 = 0; w1 = 0;
for (int j = 0; j < i; j++)
{
cnt0 += histogram[j];
sum0 += j*histogram[j];
}
u0 = (double)sum0 / cnt0;
w0 = (double)cnt0 / size;
for (int j = i; j < 255; j++)
{
cnt1 += histogram[j];
sum1 += j*histogram[j];
}
u1 = (double)sum1 / cnt1;
w1 = (double)cnt1 / size;
u = w0*u0 + w1*u1;
variance = w0*w1*(u0 - u1)*(u0 - u1);
if (variance > max_varience)
{
max_varience = variance;
threshold = i;
}
}
return threshold;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)