У меня есть массив, содержащий голоса (из преобразования Хафа) о том, где есть данные в кругах, которые я собрал. Как бы я пошел о сглаживании данных?
Это пример, который я сделал до сих пор (данных гораздо больше, и получить обзор невозможно). Я пытался делать то, что считал ядром более гладким, но, возможно, это не то, что я думал.
#include <iostream>
int main() {
double data[20][20]; // Unsmoothed array
double smoothed[20][20]; // Output array
double kernel[3][3]; // Kernel for smoothing
kernel[0][0] = 0.05;
kernel[0][1] = 0.1;
kernel[0][2] = 0.05;
kernel[1][0] = 0.1;
kernel[1][1] = 0.8;
kernel[1][2] = 0.1;
kernel[2][0] = 0.05;
kernel[2][1] = 0.1;
kernel[2][2] = 0.05;
double factor = (double)5 / (double)7; // To normalize the kernel
double counter = 0.0;
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 20; i++)
{
data[i][j] = counter; // Elements go from 0 to 299
smoothed[i][j] = 0; // Set all elements to zero
counter++;
}
}
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 20; i++)
{
if (i > 0 && j > 0 && i < 19 && j < 19)
{
smoothed[i][j] = (
kernel[0][0] * data[i - 1][j - 1] +
kernel[0][1] * data[i ][j - 1] +
kernel[0][2] * data[i + 1][j - 1] +
kernel[1][0] * data[i - 1][j ] +
kernel[1][1] * data[i ][j ] +
kernel[1][2] * data[i + 1][j ] +
kernel[2][0] * data[i - 1][j + 1] +
kernel[2][1] * data[i ][j + 1] +
kernel[2][2] * data[i + 1][j + 1]
) * factor;
}
}
}
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 20; i++)
{
std::cout << smoothed[i][j] << " ";
}
std::cout << "\n";
}
}
Тем не менее, это дает тот же результат, что и входные данные — за исключением того, что они обрезают край данных, но в любом случае это не проблема для моих данных.
Это абсолютно неправильный способ сделать это, или я просто упускаю некоторые детали?
Задача ещё не решена.
Других решений пока нет …