ElementType** malloc2DArray(int nRow, int nColumn)
{
ElementType **filter = (ElementType**)malloc(sizeof(ElementType*)*nRow);
for (int y = 0;y < nRow;y++) {
*(filter+y) = (ElementType*)malloc(sizeof(ElementType)*nColumn);
}
return filter;
}
ElementType** makeGaussianFilter(int size, ElementType sigma)
{
ElementType** filter = malloc2DArray(size, size);
int center = (size - 1) / 2;
ElementType sum = 0;
ElementType x2 = 0;
ElementType y2 = 0;
for (int y = 0;y < size;y++)
{
x2 = pow(ElementType(y-center), 2);
for (int x = 0;x < size;x++)
{
y2 = pow(ElementType(x-center), 2);
*(*(filter+y)+x) = exp(-(x2+y2) / (2*sigma*sigma));
sum += *(*(filter+y)+x);
}
}
if (0.0 != sum)
{
for (int y = 0;y < size;y++)
{
for (int x = 0;x < size;x++) {
*(*(filter+y)+x) /= sum;
}
}
}
return filter;
}
ElementType* GaussianFilter(int size, ElementType sigma)
{
if (!(size%2)) {
size += 1;
}
ElementType **filter2D = makeGaussianFilter(size, sigma);
ElementType *filter = (ElementType*)malloc(sizeof(ElementType)*size*size);
for (int y = 0;y < size;y++)
{
for (int x = 0;x < size;x++) {
*(filter+y*size+x) = *(*(filter2D+y)+x);
}
}
return filter;
}
近期评论