【问题标题】:Implementation of 'Difference of Gaussians' in OpenCVOpenCV中“高斯差”的实现
【发布时间】:2019-08-28 06:37:39
【问题描述】:

对于一个项目,我试图从图像中提取相当暗淡的轮廓。在玩 GIMP 时,我找到了一种方法,可以使用半径 1=1 和半径 2=25(甚至更大)的“高斯差”精美地提取和阈值这些轮廓。但是,当尝试在 OpenCV 中重新实现此工作流程时,我的结果不如 GIMP(较暗,较不清晰): Difference in DoG Implementation OpenCV vs. GIMP

我浏览了 GIMPs 源代码,发现在最新版本(我正在使用)中有两种 DoG 实现。我使用的是基于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() 来增强结果的对比度,但这也没有产生任何可用的东西。

我很乐意感谢您对这里发生的事情的任何想法。 谢谢!

【问题讨论】:

  • 是的,我通读了该线程,但据我所知,他们从未找到解决方案。
  • 可能依赖于线性 vs.伽玛校正。在 Gimp 中,2.10 的结果(线性 AFAIK)比 2.8 版本的结果(伽马校正)要好得多。 Example
  • 感谢您的建议,看起来很有希望,您能详细说明一下吗?我需要重现 Gimp 中发生了什么?

标签: opencv computer-vision gimp


【解决方案1】:

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

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


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

【讨论】:

  • 据我了解,当 Gimp 处理线性数据时,它会撤消伽玛校正,因此 linear=pow(initial,1/gamma),其中初始值在 [0,1.0[ 中,伽玛值约为 2.2。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多