C++ 在OpenCv中扩展轮廓

C++ 在OpenCv中扩展轮廓,c++,image-processing,opencv,C++,Image Processing,Opencv,我的图像中有几个由几个黑色区域组成的轮廓。与这些黑色区域直接相邻的是一些不属于我的轮廓的较亮区域。我想将这些较亮的区域添加到黑色区域,从而在OpenCv中扩展轮廓。 是否有一种方便的方法来延伸轮廓?我想从我用cv::Sobel创建的梯度图像中观察强度变化,并一直延伸到梯度再次变化,这意味着像素的强度将回到图像中既不黑也不亮的区域 谢谢 下面是一些示例图像。第一张图片显示原始图像,第二张图片显示使用Canny&findContours提取的轮廓,最后一张图片显示同一区域的Sobel梯度强度图像。

我的图像中有几个由几个黑色区域组成的轮廓。与这些黑色区域直接相邻的是一些不属于我的轮廓的较亮区域。我想将这些较亮的区域添加到黑色区域,从而在OpenCv中扩展轮廓。
是否有一种方便的方法来延伸轮廓?我想从我用
cv::Sobel
创建的梯度图像中观察强度变化,并一直延伸到梯度再次变化,这意味着像素的强度将回到图像中既不黑也不亮的区域

谢谢

下面是一些示例图像。第一张图片显示原始图像,第二张图片显示使用Canny&findContours提取的轮廓,最后一张图片显示同一区域的Sobel梯度强度图像。 我想在轮廓的第一个图像中包括明亮的边界

更新:现在我对Sobelgradients使用了一些形态学操作,并在其周围添加了一个轮廓(见下图)。下一步可能是找到相邻的一对紫色和红色轮廓线,但实际上必须搜索直接相邻的轮廓线似乎是在浪费行进时间。还有更好的主意吗


更新2:我现在的解决方案是在我的(紫色)轮廓周围的边界框中搜索变形渐变(红色)轮廓,并选择方向和大小正确的轮廓。这适用于渐变轮廓,其中形态学操作关闭“上升”和“下降”渐变区域,如图3所示。但对于照明区域比上图更宽的情况,这仍然是一个糟糕的解决方案。任何想法仍然非常感谢,谢谢

您要做的是找到两个不同的功能并合并它们。这并不十分困难,但您必须使用图像的多个副本才能实现

  • 制作一份副本,并为黑暗部分设置阈值
  • 制作另一份副本并为灯光部分设置阈值
  • 将两个阈值图像合并为新图像
  • 应用形态学操作,如打开或关闭(取决于阈值),这将连接附近的组件
  • 在合成图像中查找轮廓
  • 在原始图像上使用这些轮廓。这将起作用,因为所有图像的大小都相同,并且都是基于原始图像

  • 请提供一个样本图片!!!好的,给我的问题添加了一些图片和说明。谢谢你的回答。是的,在最初的帖子中提到的方法不是很有用,因为它不能处理大的灯光区域。你的方法大体上也是我最后提出的,而且效果很好。但我的方法是找到暗的部分,然后在它周围放置一个ROI,在亮的部分图像中搜索一个最合适的搭档,然后合并它们。你的方法可能会失败,如果我在一个黑暗的部分周围有几个光明的部分。但是我会接受你的答案,因为对图像进行两次阈值化的方法导致了我的最终解决方案…啊,我明白你的意思。我不知道你可能有多个轻部分候选人,你需要选择最好的一个。很高兴我能帮上忙。