'Difference of Gaussians' 在 OpenCV 中的实现

Implementation of 'Difference of Gaussians' in OpenCV

对于一个项目,我试图从图像中提取非常暗淡的轮廓。在使用 GIMP 时,我找到了一种使用 "Difference of Gaussians" 和 radius1=1 和 radius2=25(或更大)来精美地提取和阈值这些轮廓的方法。但是,当尝试在 OpenCV 中重新实现此工作流程时,我的结果不如 GIMP(调暗器,不太清晰): Difference in DoG Implementation OpenCV vs. GIMP

我浏览了 GIMPs 源代码,发现在最新版本(我正在使用)中有两种 DoG 实现。我用的是non-legacy,它是基于GEGL的,源代码可以找到here.

我根据 here 实施:

{
  Mat g1, g2, result;
  GaussianBlur(input, g1, Size(0, 0), gaussian1, gaussian1);
  GaussianBlur(input, g2, Size(0, 0), gaussian2, gaussian2);
  cv::subtract(g1, g2, result);
  return result;
}

如您所见,我的实现和 GEGL 的实现在表面上是相同的,但结果却大不相同。 我已经尝试使用 cv::equalizeHist() 来增强结果的对比度,但这也没有产生任何可用的结果。

如果您对这里发生的事情有任何想法,我将不胜感激。 谢谢!

感谢 @xenoid 的指针,我找到了(部分)实现我想要的方法。

我现在所做的是从上面获取 Codesnippet,然后简单地将 Mat result 乘以一个因子。 完整代码片段:


cv::Mat differenceOfGaussians(cv::Mat input, int gaussian1, int gaussian2)
{
  Mat g1, g2, result;
  GaussianBlur(input, g1, Size(0, 0), gaussian1, gaussian1);
  GaussianBlur(input, g2, Size(0, 0), gaussian2, gaussian2);
  cv::subtract(g1, g2, result);
  result = result * gammaInt;
  return result;
}

gammaInt 是通过滑块控制的全局 int 变量。 可以在此处找到结果(为了获得更好的图像并由相机本身完成一些对比放大):DoG with linear amplification