我有一个包含投票(来自Hough变换)的数组,其中有数据中的圆圈,我收集了。我将如何平滑数据?
这是我到目前为止所做的一个例子(数据更大,无法概述)。我尝试做我认为内核更平滑的东西,但它可能不是我想的那样。
#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";
}
}
但是,这会产生与输入相同的输出 - 除了切断数据的边缘,但这对我的数据来说并不是问题。
这是完全错误的做法,还是我只是错过了一些细节?