生成的高斯核在c++中使用opencv将图像饱和为白色



我正试图实现一个函数,它给了我高斯内核给定一定的标准偏差和维度。该函数的输出似乎是正确的,但是当我使用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;图片:链接到图片

与读取或修改图像相关的部分代码:

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);

问题的原因是将cv::filter2Dddepth参数设置为CV_32F

设置参数值为-1解决问题:

cv::filter2D(clean_1, clean_1, -1, customKernel, cv::Point(-1,-1), 0, cv::BORDER_DEFAULT);

ddepth参数设置为CV_32F,则cv::filter2D的输出类型为CV_32F(float类型的像素)。

输出值的范围为[0,255](与输入值的范围相同)。
对于类型为CV_32F(float)的像素,OpenCV约定黑色为0,白色为1。大于1.0的值也是白色的。

我能想到三个相关的解决方案:

  • 通过将ddepth设置为-1,保持输出类型CV_8U(与输入类型相同)
  • 将内核除以255:customKernel /= 255.0f;.
  • 将输出图像除以255:clean_1 /= 255.0f;.

相关内容

  • 没有找到相关文章

最新更新