首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自适应门限后的断线轮廓

自适应门限后的断线轮廓
EN

Stack Overflow用户
提问于 2013-08-14 02:37:57
回答 2查看 4K关注 0票数 2

我想自适应地阈值这个图像,使用findContours()从OpenCV找到外部边框。由于通常的原因,我使用自适应阈值:全局阈值,即使采用Otsu的方法,也不能充分补偿图像不同部分之间的亮度差异。

不幸的是,自适应阈值处理会在一些有粗网格的交叉口造成断点。这是因为,对于交点上的像素,粗网格占用了周围区域的太多,因此在交集处,局部阈值高于像素的值(只有中等的暗值)。令人惊讶的是,这种效果在某种程度上仍然适用于大阈值窗口。

当然,这使得自适应阈值对于在这些类型的图像中寻找轮廓毫无用处。然而,与Canny等其他算法相比,它在处理连通边缘方面仍然要好得多。

通过手动填充图像中的所有一个像素和两个像素的空白,我能够在自适应阈值处理后重新连接边缘(实际上,为了节省运行时间,我对缩小的图像进行了阈值处理;在上面的全尺寸图像中,空白更大)。下面是我使用的OpenCV代码(为Android绑定编写的)。0是黑色的,-1是白色的。

代码语言:javascript
运行
复制
private void fillGaps(Mat image) {

    int size = image.rows() * image.cols();
    byte[] src = new byte[size], dst = new byte[size];
    image.get(0, 0, src);

    int c = image.cols();
    int start = 2 * c + 2;
    int end = size - start;
    for (int i = start; i < end; i++) {
        if (src[i+1] == -1 && src[i-1] == -1 || src[i+c] == -1 && src[i-c] ==-1){
            // 1-pixel gap
            dst[i] = -1;
        } else if (src[i+1] == 0 && src[i+2  ] == -1 && src[i-1] == -1) {
            // 2-pixel horizontal gap
            dst[i] = -1; dst[i+1] = -1;
        } else if (src[i+c] == 0 && src[i+2*c] == -1 && src[i-c] == -1) { 
            // 2-pixel vertical gap
            dst[i] = -1; dst[i+c] = -1;
        }
    }

    image.put(0, 0, dst);
}

以下是填充空白之前和之后的缩小图像:

虽然这在这里运行得很好,但它是一种粗糙的技术,并不能填补所有的空白,有时还会与附近的等高线一起加入网格。

什么是避免自适应阈值后断开轮廓的可靠方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-14 12:25:49

您正在采取的自适应阈值方法是可以的,但作为下一步,您应该做一些形态学操作:侵蚀,扩张,开放,关闭。对于您的特殊情况,关闭操作将是合适的。

还有Open内置的方法cvDilate和cvErode。结构元素的形状并不重要,但要保持较小的大小。

我看到了你填补这些空白的办法。在这里,您没有考虑对角线元素。最好是在每个像素周围设置一个3x3或5x5窗口,比较每个元素,然后决定结果。

代码语言:javascript
运行
复制
counter=0;
for (int k=i-radius; k<=i+radius; k++)
{
  for (int l=j-radius; l<=j+radius; l++)
  {
    if (src[k][l] == -1)
    counter++;
  }
}

if (counter > 0)
  dest[k][l] = -1;
else
  dest[k][l] = 0;

这是我用于扩展(或填补空白)的示例代码。半径可以是1 (3x3)或2(5x5)。

票数 2
EN

Stack Overflow用户

发布于 2016-11-28 19:36:24

尝试在adaptiveThreshold之后扩展图像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18222342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档