【问题标题】:OpenCV - Thinning with lines on binary mat leads to random horizontal dotted linesOpenCV - 用二进制垫上的线条细化会导致随机水平虚线
【发布时间】:2019-08-04 19:09:35
【问题描述】:

我正在编写一种方法来从二进制图像(背景为黑色)中细化白线。本质上,代码循环遍历图像并找到同一行中的连续白色像素,将它们全部变为黑色,最后将中间的像素变为白色。该算法可以很好地细化线条,但会在根本不应该有任何东西的地方产生随机的水平虚线。下面是一个例子:

图像到细线来自:

算法运行后的图像:

显然,图像顶部和底部附近的虚线不应该存在,因为原始图像中没有白色区域,但它们以某种方式生成。我已经附上了我的代码来做下面的细化,非常感谢任何帮助!

//Line thining
    double[] rgbCanny;
    int inARow = 0;

    for(int i = 0; i < noiseReducedCanny.size().height; i++) {
        for(int j = 0; j < noiseReducedCanny.size().width; j++) {

            rgbCanny = noiseReducedCanny.get(i, j);

            if(rgbCanny[0] == 255) {
                inARow++;
            } else {
                if(inARow != 0 && inARow % 2 == 1) {
                    int middle = (int) Math.ceil(j - inARow / 2.0);
                    for(int x = j - inARow; x < j; x++) {
                        noiseReducedCanny.put(i, x, new double[]{0, 0, 0});
                    }
                    noiseReducedCanny.put(i, middle, new double[]{255, 255, 255});
                } else if (inARow != 0 && inARow % 2 == 0) {
                    int middle = j - inARow / 2;
                    for(int x = j - inARow; x < j; x++) {
                        noiseReducedCanny.put(i, x, new double[]{0, 0, 0});
                    }
                    noiseReducedCanny.put(i, middle, new double[]{255, 255, 255});
                }
                inARow = 0;
            }
        }
    }

【问题讨论】:

    标签: java android opencv


    【解决方案1】:

    请注意,即使算法看起来有效,您的线条也不是 1 像素宽。它们有 3 个像素宽。

    显然put() 将 3 个连续像素设置为白色,从给定索引 (middle) 开始。 2 个意外像素导致您的算法“反馈”到自身,这意味着它们正在触发 inARow++ 行。

    我不是 OpenCV 人,我无法轻松找到 put() 的文档,所以我不知道您应该如何将单个 RGB 值添加到 mat。然而,似乎有可能改变这一点:

    new double[]{255, 255, 255}
    

    到这里:

    new double[]{255}
    

    将导致所需的行为。

    您可能也想修复“变黑”的线条。

    【讨论】:

    • 非常感谢!解决方案奏效了!只是一个简单的问题,为什么新的 double[]{0,0,0} 行没有错误?这个问题似乎只发生在 255 号码上。
    • 不客气。我建议坐下来用垫子和纸准确地勾勒出当这两个额外的白色像素被添加到“当前像素”的右侧时算法中会发生什么。仅当遇到特别短的“运行”白色像素(例如,连续 1 个或 2 个)时才会触发该错误。一个“无意添加”的新白色像素然后再次触发错误,b/c 它创建了看起来像另一个“短期运行”的东西。黑色像素无法做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多