opencv中阈值的替代方案

use*_*765 2 opencv image-processing computer-vision

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

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

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

    cvtColor(handMat,handMat,CV_BGR2GRAY);

  2. meadianblur

    medianBlur(handMat,handMat,MEDIAN_BLUR_K);

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

threshold( handMat, handMat, 141, 255, THRESH_BINARY||CV_THRESH_OTSU );
Run Code Online (Sandbox Code Playgroud)

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

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

好的门槛输出:

在此输入图像描述

错误的阈值输出

在此输入图像描述

Vla*_*lad 5

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

顺便说一下,当您找到90%左右的段时,抓取切割使用颜色信息来改善边界上的分割,因此这是一个后处理步骤.此外,您使用矩形初始化抓取切割会使背景颜色受到很多污染.而不是矩形使用一个掩码,你可以确定手是在你的初始段深处标记为GC_FGD; 在您确定背景的区域外标记为GC_BGD; 标记GC_PR_FGD或者可能是其他地方的前景 - 这是通过抓取来改进的.总结一下 - 你的抓取初始化看起来像一个俄罗斯娃娃,有三层表示前景(灰色),可能是前景(白色)和背景(黑色).您可以使用扩张和侵蚀来创建这些图层,请参见下文

在此输入图像描述

总的来说,我的建议是先定义你想要做的事情.您是否在任意移动背景上寻找任意物体的轮廓?如果您正在寻找手的轮廓以在相对均匀的背景上找到手指,我会:1.使用连接组件MSER来分割手.使用保守面具而非矩形初始化的抓取切割可能会改善结果!2. 如果这是你的目标,使用凸度缺陷找到手指;