对于一个项目,我试图从图像中提取漂亮的暗淡轮廓。在玩转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;
}
来增强结果的对比度,但这也没有产生任何可用的结果。
我很高兴对这里发生的事情有任何想法。 谢谢!
答案 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