在OpenCV中实现“高斯差异”

时间:2019-08-28 06:37:39

标签: opencv computer-vision gimp

对于一个项目,我试图从图像中提取漂亮的暗淡轮廓。在玩转GIMP时,我发现了一种使用“高斯差异”(半径1 = 1和半径2 = 25(或更大))精美地提取和限定轮廓的方法。但是,当尝试在OpenCV中重新实现此工作流程时,我的结果不如GIMP更好(调光器,较不清晰): Difference in DoG Implementation OpenCV vs. GIMP

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

我根据here的实现方式:

.h

因此,如您所见,我的实现和GEGL在表面上是相同的,但是结果却大不相同。 我已经尝试过使用{ 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; } 来增强结果的对比度,但这也没有产生任何可用的结果。

我很高兴对这里发生的事情有任何想法。 谢谢!

1 个答案:

答案 0 :(得分:0)

借助于@xenoid的Pointer,我找到了一种(部分)实现我想要的方法的方法。

我现在要做的是从上方获取代码片段,并将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