【发布时间】:2021-11-19 03:00:55
【问题描述】:
我正在尝试实现一个函数,该函数在给定特定标准偏差和维度的情况下为我提供高斯核。该函数的输出似乎是正确的,但是当我使用 cv::filter2D 函数应用它时,我得到的结果很奇怪。值饱和到最大值,呈现白色。
生成内核的函数实现如下:
cv::Mat gaussKernel(int kernel_size, float stdDev)
{
// For now, only odd kernel_size values
std::default_random_engine generator;
std::normal_distribution<float> distribution(0, stdDev);
float sum_term {0};
cv::Mat kernel = cv::Mat::zeros(kernel_size, kernel_size, CV_32F);
// Create kernel
for (int i = -kernel_size/2; i <= kernel_size/2; i++)
{
for (int j = -kernel_size/2; j <= kernel_size/2; j++)
{
kernel.at<float>(i + kernel_size/2,j + kernel_size/2) = std::exp(-(pow(i,2) + pow(j,2))/(2*pow(stdDev,2)));
sum_term += kernel.at<float>(i + kernel_size/2,j + kernel_size/2);
}
}
kernel /= sum_term;
std::cout << "The kernel is: " << std::endl;
for (int i = 0; i < kernel.rows; i++)
{
std::cout << " ";
for (int j = 0; j < kernel.cols; j++)
{
std::cout << kernel.at<float>(i,j) << ", ";
}
std::cout << std::endl;
}
return kernel;
}
一切都是用灰度图片完成的。我预计该错误与内核矩阵中使用的编码有关,但我测试了一些东西并没有收到任何结果。
--编辑: stdDev 的值 = 1; kernel_size 的值 = 3;
图片: Link to image
与读取或修改图片相关的部分代码:
std::string dir {"../resources/ORings/ORing01.jpg"};
cv::Mat original, customKernel;
original = cv::imread(dir);
cv::Mat noisy = original.clone();
cv::Mat clean_1 = original.clone();
customKernel = gauss::gaussKernel(kernel_size, 1);
noisy = gauss::addGaussianNoise(noisy, SNR);
cv::filter2D(clean_1, clean_1, CV_32F, customKernel, cv::Point(-1,-1), 0, cv::BORDER_DEFAULT);
【问题讨论】:
-
问题不可重现。请发布
kernel_size和stdDev的值。请发布示例输入图像,以及您用于读取图像和应用过滤器的代码。 -
@Rotem 我刚刚添加了所需的信息。
标签: c++ opencv image-processing gaussian gaussianblur