Newer
Older
#include <vector>
#include "Defines.h"
float* createEllipsoidKernel(Vec<size_t> radii, Vec<size_t>& kernelDims)
float* kernel = new float[kernelDims.product()];
memset(kernel,0,sizeof(float)*kernelDims.product());
Vec<float> dimScale = Vec<float>(1,1,1) / Vec<float>(radii.pwr(2));
Vec<float> tmp = dimScale * Vec<float>((cur-mid).pwr(2));
if (tmp.x+tmp.y+tmp.z<=1.0f)
{
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];
}
{
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];
}
if (sigma_b_squared[i] > maxVal*0.95)
maxs.push_back(i);
}
if (maxVal!=0 && !maxs.empty())
{
for (std::vector<int>::iterator it=maxs.begin(); it!=maxs.end(); ++it)
delete[] omegas;
delete[] mus;
delete[] sigma_b_squared;
return floor(mean);