C++ 边缘检测算法中的噪声消除

C++ 边缘检测算法中的噪声消除,c++,theory,noise,edge-detection,C++,Theory,Noise,Edge Detection,我最近写了一个非常基本的边缘检测算法,它可以处理字符数组。该程序的目的是检测数组中单个特定值的斑点的边缘,其工作方式是简单地在数组元素上左、右、上、下查看,并检查其中一个值是否与当前查看的值不相同。目标不是生成一条数学线,而是一组表示描述的闭环边的有序点 该算法工作得非常好,只是我的数据中含有一点噪声,因此会在没有边缘的地方随机产生边缘。这反过来又对我的其他一些程序造成了严重破坏 数据包含两种类型的噪波。第一种类型相当稀疏,有些随机。第二种类型是x=y轴上的半连续直线。我知道第一类噪声的来源,这

我最近写了一个非常基本的边缘检测算法,它可以处理字符数组。该程序的目的是检测数组中单个特定值的斑点的边缘,其工作方式是简单地在数组元素上左、右、上、下查看,并检查其中一个值是否与当前查看的值不相同。目标不是生成一条数学线,而是一组表示描述的闭环边的有序点

该算法工作得非常好,只是我的数据中含有一点噪声,因此会在没有边缘的地方随机产生边缘。这反过来又对我的其他一些程序造成了严重破坏

数据包含两种类型的噪波。第一种类型相当稀疏,有些随机。第二种类型是x=y轴上的半连续直线。我知道第一类噪声的来源,这是数据的一个特征,对此我无能为力。至于第二种类型,我知道这是我的程序的错误造成的…虽然我没有一个热点线索确切地说是什么造成的

我的问题是: 我应该如何彻底消除噪音

我知道,正确的数据具有始终相邻的点,并且非常紧凑、有序(没有间隙),并且是一个闭合循环或多个循环。第一类噪声通常是稀疏的和随机的,通过检查是否有任何边在下一个噪声点也被算作一条边,可以很容易地解决这一问题。如果不是,则该点是最具挑战性的噪音,应予以删除

然而,第二种类型的噪声,即我们有一条关于x=y的半连续线,会带来更多的问题。这条线有时是连续的,长度是随机的(最长的是它在我整个阵列的一半处没有断裂)。它甚至可以与实际边相交


有什么办法吗

通常在图像处理中使用中值滤波器


通常,在图像处理过程中,为了缩小线条中的任何间隙,通常会进行放大(使线条变大)而不是腐蚀(使线条变细)


您还经常进行扩张(使线条变大)而不是腐蚀(使线条变细),以缩小线条中的任何间隙。这是我将在单元测试中介绍的内容。获取一些显示此问题的最小数据集(小到可以直接编码到测试文件中的数据集),运行测试,使用小数据集只需一步一步地进行,看看发生了什么。

这是我将在单元测试中用到的东西。获取一些显示此问题的最小数据集(小到可以直接编码到测试文件中的数据集),运行测试,使用小数据集只需一步一步地查看发生了什么。

噪声往往集中在更高的频率,因此在进行边缘检测之前对图像运行低通滤波器。我见过这种原理用于亚像素边缘检测。

噪声往往集中在较高的频率,所以在进行边缘检测之前,先对图像运行低通滤波器。我见过这种原理用于亚像素边缘检测。

我不需要连接线。大多数情况下,数据几乎完全干净,应该是边的任何边都被完美地拾取,并且绝对没有间隙。产生间隙的是噪音。这就是我想要去除的噪声。你可以过滤噪声,但你会降低图像的对比度-看看中值或低通滤波器刚刚与该领域的专家完成了一个小时的会议,是的,你的权利修改后的中值是我需要的,考虑到噪声总是一条细线,而要检测的边缘总是大斑点。很抱歉,我是一名机械工程师,在这一领域没有任何经验,显然我所做的根本不是边缘检测。不管怎样,中值滤波器是我所需要的。通常噪声是在不同的频率-在这种情况下,噪声是高频的,所以你可以用中值滤波器平滑它。我不需要连接线。大多数情况下,数据几乎完全干净,应该是边的任何边都被完美地拾取,并且绝对没有间隙。产生间隙的是噪音。这就是我想要去除的噪声。你可以过滤噪声,但你会降低图像的对比度-看看中值或低通滤波器刚刚与该领域的专家完成了一个小时的会议,是的,你的权利修改后的中值是我需要的,考虑到噪声总是一条细线,而要检测的边缘总是大斑点。很抱歉,我是一名机械工程师,在这一领域没有任何经验,显然我所做的根本不是边缘检测。不管怎样,中值滤波器是我所需要的。通常噪声是在不同的频率-在这种情况下,噪声是高频的,所以你用中值滤波器平滑它