为了账号安全,请及时绑定邮箱和手机立即绑定

OpenCV - 用二进制垫上的线条细化会导致随机水平虚线

OpenCV - 用二进制垫上的线条细化会导致随机水平虚线

侃侃尔雅 2023-05-17 15:05:20
我正在编写一种方法来从二进制图像(背景为黑色)中提取细白线。本质上,代码循环遍历图像并找到同一行中的连续白色像素,将它们全部变为黑色,最后将中间的像素变为白色。该算法可以很好地细化线条,但会产生随机的水平虚线,而这些虚线根本不应该有任何东西。下面是一个例子:图像细线来自:算法运行后的图像:显然,图像顶部和底部附近的虚线不应该存在,因为原始图像中没有白色区域,但它们是以某种方式生成的。我附上了我的代码来做下面的细化,非常感谢任何帮助!//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;            }        }    }
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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

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

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

new double[]{255, 255, 255}

对此:

new double[]{255}

将导致所需的行为。

您可能也想修复“涂黑”线。


查看完整回答
反对 回复 2023-05-17
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信