Newer
Older
Eric Wait
committed
#include "KernelGenerators.h"
#include <functional>
float* createLoG_GausKernels(Vec<double> sigmas, Vec<size_t>& dimsOut)
Eric Wait
committed
{
const double PI = std::atan(1.0) * 4;
dimsOut.x = (size_t)MAX(1.0f, (10 * sigmas.x));
dimsOut.y = (size_t)MAX(1.0f, (10 * sigmas.y));
dimsOut.z = (size_t)MAX(1.0f, (10 * sigmas.z));
Eric Wait
committed
dimsOut.x = (dimsOut.x % 2 == 0) ? (dimsOut.x + 1) : (dimsOut.x);
dimsOut.y = (dimsOut.y % 2 == 0) ? (dimsOut.y + 1) : (dimsOut.y);
dimsOut.z = (dimsOut.z % 2 == 0) ? (dimsOut.z + 1) : (dimsOut.z);
Eric Wait
committed
Eric Wait
committed
float* kernelOut = new float[dimsOut.sum()*2];
Eric Wait
committed
Vec<double> oneOverSigSqr = Vec<double>(1.0) / sigmaSqr;
Eric Wait
committed
Vec<double> twoSigmaSqr = sigmaSqr * 2;
Vec<double> sigmaForth = sigmas.pwr(4);
int loGstride = dimsOut.sum();
Eric Wait
committed
for (int i = 0; i < 3; ++i)
Eric Wait
committed
{
int stride = 0;
if (i > 0)
stride = dimsOut.x;
if (i > 1)
stride += dimsOut.y;
Eric Wait
committed
if (sigmas.e[i] == 0)
Eric Wait
committed
{
kernelOut[stride] = 0.0f;
kernelOut[stride + loGstride] = 1.0f;
continue;
}
double gaussSum = 0.0;
for (int j = 0; j < dimsOut.e[i]; ++j)
{
double pos = j - mid.e[i];
double posSqr = SQR(pos);
double gauss = exp(-(posSqr / twoSigmaSqr.e[i]));
double logVal = (posSqr / sigmaForth.e[i] - oneOverSigSqr.e[i])*gauss;
kernelOut[j + stride] = (float)logVal;
kernelOut[j + stride + loGstride] = gauss;
gaussSum += gauss;
}
double sumVal = 0.0;
for (int j = 0; j < dimsOut.e[i]; ++j)
{
kernelOut[j + stride] /= (float)gaussSum;
sumVal += kernelOut[j + stride];
kernelOut[j + stride + loGstride] /= (float)gaussSum;
Eric Wait
committed
}
for (int j = 0; j < dimsOut.e[i]; ++j)
Eric Wait
committed
{
kernelOut[j + stride] -= (float)sumVal;
Eric Wait
committed
}
}
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//bool is3d = sigmas != Vec<double>(0.0);
//
//if (is3d)
//{
// // LaTeX form of LoG
// // $\frac{\Big(\frac{(x-\mu_x)^2}{\sigma_x^4}-\frac{1}{\sigma_x^2}+\frac{(y-\mu_y)^2}{\sigma_y^4}-\frac{1}{\sigma_y^2}+\frac{(z-\mu_z)^2}{\sigma_z^4}-\frac{1}{\sigma_z^2}\Big)\exp\Big(-\frac{(x-\mu_x)^2}{2\sigma_x^2}-\frac{(y-\mu_y)^2}{2\sigma_y^2}-\frac{(z-\mu)^2}{2\sigma_z^2}\Big)}{(2\pi)^{\frac{3}{2}}\sigma_x\sigma_y\sigma_z}$
// Vec<double> sigma4th = sigmas.pwr(4);
// double subtractor = (Vec<double>(1.0f, 1.0f, 1.0f) / sigmaSqr).sum();
// double denominator = pow(2.0*PI, 3.0 / 2.0)*sigmas.product();
// for (int i =0; i<3; ++i)
// {
// size_t startOffset = 0;
// if (i > 0)
// startOffset += dimsOut.x;
// if (i > 1)
// startOffset += dimsOut.y;
// for (int j = 0; j<dimsOut.e[i]; ++j)
// {
// int firstOther = 0;
// if (j == 0)
// firstOther = 1;
// int secondOther = 2;
// if (j == 2)
// secondOther = 1;
// double firstAdditive = -1.0 / sigmaSqr.e[firstOther];
// double secondAdditive = -1.0 / sigmaSqr.e[secondOther];
// double muSub = SQR(j - mid.e[i]);
// double muSubSigSqr = muSub / (2 * sigmaSqr.e[i]);
// double additive = muSub / sigma4th.e[i] - 1.0 / sigmaSqr.e[i];
// double posVal = ((additive + firstAdditive + secondAdditive) * exp(-muSubSigSqr)) / denominator;
// kernelOut[startOffset + j] = (float)posVal;
// }
// }
//}
//else
//{
// // LaTeX form of LoG
// // $\frac{-1}{\pi\sigma_x^2\sigma_y^2}\Bigg(1-\frac{(x-\mu_x)^2}{2\sigma_x^2}-\frac{(y-\mu_y)^2}{2\sigma_y^2}\Bigg)\exp\Bigg(-\frac{(x-\mu_x)^2}{2\sigma_x^2}-\frac{(y-\mu_y)^2}{2\sigma_y^2}\Bigg)$
// // figure out which dim is zero
// double sigProd = 1.0;
// if (sigmas.x != 0)
// sigProd *= sigmas.x;
// if (sigmas.y != 0)
// sigProd *= sigmas.y;
// if (sigmas.z != 0)
// sigProd *= sigmas.z;
// double denominator = -PI*sigProd;
// for (int i=0; i<2; ++i)
// {
// size_t startOffset = i*dimsOut.e[0];
// for (int j = 0; j < dimsOut.e[i]; ++j)
// {
// double gaussComp = SQR(j - mid.e[i]) / twoSigmaSqr.e[i];
// double posVal = ((1.0 - gaussComp)*exp(-gaussComp)) / denominator;
// kernelOut[startOffset + j] = (float)posVal;
// }
// }
//}