CHelpers.cpp 1.80 KiB
#include "CHelpers.h"
#include <vector>
#include "Defines.h"
float* createEllipsoidKernel(Vec<size_t> radii, Vec<size_t>& kernelDims)
{
kernelDims = radii*2 +1;
float* kernel = new float[kernelDims.product()];
memset(kernel,0,sizeof(float)*kernelDims.product());
Vec<int> mid((kernelDims-1)/2);
Vec<float> dimScale = Vec<float>(1,1,1) / Vec<float>(radii.pwr(2));
Vec<int> cur(0,0,0);
for (cur.z=0; cur.z<kernelDims.z; ++cur.z)
{
for (cur.y=0; cur.y<kernelDims.y; ++cur.y)
{
for (cur.x=0; cur.x<kernelDims.x; ++cur.x)
{
Vec<float> tmp = dimScale * Vec<float>((cur-mid).pwr(2));
if (tmp.x+tmp.y+tmp.z<=1.0f)
{
kernel[kernelDims.linearAddressAt(cur)] = 1.0f;
}
}
}
}
return kernel;
}
int calcOtsuThreshold(const double* normHistogram, int numBins)
{
double* omegas = new double[numBins];
double* mus = new double[numBins];
double* sigma_b_squared = new double[numBins];
double maxVal = 0.0;
std::vector<int> maxs;
maxs.reserve(numBins);
omegas[0] = normHistogram[0];
mus[0] = 0.0;
double lastOmega = normHistogram[0];
double lastMu = 0.0;
for (int i=1; i<numBins; ++i)
{
omegas[i] = lastOmega + normHistogram[i];
mus[i] = lastMu + (i*normHistogram[i]);
lastOmega = omegas[i];
lastMu = mus[i];
}
for (int i=0; i<numBins; ++i)
{
sigma_b_squared[i] = SQR(mus[numBins-1] * omegas[i] - mus[i]) / (omegas[i] * (1.0 - omegas[i]));
if (maxVal < sigma_b_squared[i])
maxVal = sigma_b_squared[i];
}
for (int i=0; i<numBins; ++i)
{
if (sigma_b_squared[i] > maxVal*0.95)
maxs.push_back(i);
}
double mean = 0.0;
if (maxVal!=0 && !maxs.empty())
{
for (std::vector<int>::iterator it=maxs.begin(); it!=maxs.end(); ++it)
{
mean += *it;
}
mean /= maxs.size();
}
delete[] omegas;
delete[] mus;
delete[] sigma_b_squared;
return floor(mean);
}