【问题标题】:Alternative for Threshold in opencvopencv中阈值的替代方案
【发布时间】:2014-02-26 05:15:17
【问题描述】:

我在 Opencv 中使用阈值来查找轮廓。我的输入是手形图像。有时阈值不好,所以我找不到轮廓。

我已应用以下预处理步骤
1.Grabcut

cv::grabCut(image, result,rectangle,bgModel,fgModel, 3,cv::GC_INIT_WITH_RECT);
  1. 灰度转换

    cvtColor(handMat, handMat, CV_BGR2GRAY);

  2. 中值模糊

    medianBlur(handMat, handMat, MEDIAN_BLUR_K);

我使用下面的代码找到阈值

threshold( handMat, handMat, 141, 255, THRESH_BINARY||CV_THRESH_OTSU );

有时我得到很好的输出,有时阈值输出不好。我附上了两个输出图像。

除了阈值之外还有其他方法可以找到轮廓吗?

良好的阈值输出:

阈值输出错误

【问题讨论】:

标签: opencv image-processing computer-vision


【解决方案1】:

你试过adaptive threshold吗?单个阈值值很少在实际应用中起作用。另一个真理 - 阈值是非线性操作,因此是不稳定的。另一方面,渐变是线性的,因此如果您的背景是平滑且纯色的,您可能希望通过跟踪渐变来找到轮廓。在光照变化或阴影期间,梯度也比阈值更可靠。

顺便说一下,当您已经找到 90% 左右的片段时,Grab-cut 使用颜色信息来改进边界上的分割,所以它是一个后处理 em>一步。此外,您使用矩形进行抓取切割的初始化也会导致大量背景颜色的污染。代替矩形使用掩码,在您确定手所在的初始段深处标记为 GC_FGD;在您确定背景所在的细分市场之外标记为 GC_BGD;标记 GC_PR_FGD 或者可能是其他任何地方的前景 - 这是 grab cut 将改进的内容。总而言之-您的抓取剪切初始化看起来像一个俄罗斯娃娃,三层表示前景(灰色),可能是前景(白色)和背景(黑色)。您可以使用dilate and erode 创建这些图层,见下文

总的来说,我的建议是先定义你想做什么。您是否正在寻找任意移动背景上任意物体的轮廓?如果您正在寻找手的轮廓以在相对统一的背景上找到手指,我会: 1.use connected componentsMSER分割出一手牌。使用保守蒙版而不是矩形初始化抓取切割可能会改善结果! 2. 如果这是您的目标,请使用convexity defects 寻找手指;

【讨论】:

    【解决方案2】:

    一个问题是在不对图像进行二值化的情况下尝试寻找轮廓。 如果您的输入是彩色的,您可以尝试更改色彩空间以增强手部和背景之间的差异。

    Otsu 尝试找到一个最佳阈值,您也可以尝试手动设置它,但 Otsu 很有用,因为如果照明发生变化,阈值会自动适应。

    还有许多其他类型的二值化:Sauvola、Bradley、Niblack、Kasar……但 Otsu 很简单,而且效果很好。如果您想提高二值化结果,我建议您进行预处理或后处理。

    【讨论】:

    • OpenCV 函数自适应阈值:docs.opencv.org/modules/imgproc/doc/…
    • 您好,我已经更新了这个问题。请看一看。我使用了预处理技术,例如 1) Grabcut 2) 灰度 3) 中值模糊。
    • 您是否尝试使用 Canny 来检测边缘?在 Canny 之后你也可以尝试使用findContours
    • 您也可以尝试做直方图均衡,以自动增强灰度图像的对比度。
    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多