检测变形线条

3

我已经在https://dsp.stackexchange.com/上提出了这个问题,但没有得到任何答案!希望能在这里得到一些建议:

我有一个项目,需要识别不同“位置”上的两条直线,这两条直线正交,但可以投影到不同的表面上。我正在使用opencv。

交点可以在框架的任何位置。直线是红色的(图像只显示灰度)。

更新

-我将使用灰度相机!!!!!

-背景和投射直线的对象可能会发生变化
ilnes on straight surface

deformed lines

我并不是要求代码,只是想知道如何解决这个问题?我尝试过houghlines函数,但它只适用于直线表面。预先感谢您的回答!


这些线条还有其他的属性吗?交点是否靠近图片中心?它们总是白色的吗? - Abhishek Bansal
第二张图片中的光线条件真的像展示的那样糟糕吗?问题在于你的线条不是直的,不连续,并且与背景没有不同的颜色。如果你能够改善这些条件(例如添加黑色纸板作为背景),这将极大地提高图像质量并使线条识别更容易。 - Mailerdaimon
@AbhishekBansal 不,交叉点可以在框架的任何位置,而线条是红色的,只是灰度。 - Engine
@Mailerdaimon 我无法影响背景,它可能是任何东西!!我知道这只会让事情变得更糟!但如果它们被扭曲了,如何检测它们? - Engine
1
@Engine,您能否更精确地描述一下您的设置?这样就可以避免有关是否可以使用颜色信息来检测线条的混淆了。 - Mailerdaimon
@Mailerdaimon 抱歉。 - Engine
4个回答

4
这不是一项难度很大的任务,因为它包含了直线。我已经完成过类似的项目。
  1. 首先,如果您的图像是彩色的,请将其转换为灰度。
  2. 然后使用校准的中值滤波器对图像进行模糊处理。
  3. 现在从灰度图像中减去模糊图像。
  4. 执行第3步后,如果查看图像,您会发现在线条处的强度比图像的其他部分要高,因为这些线条具有对比度,当我们应用中值滤波器时,减去的值比图像的其余部分更多。
  5. 要获得更清晰的区分,您需要使用创建二进制图像即只有黑和白色,并设置特定的阈值。 6.最后,您可以得到线条,如果存在噪声,则可以在第4步后使用顶帽滤波器,在第5步后使用高斯滤波器。
您可以参考此文献中的裂缝检测:http://www.iaarc.org/publications/fulltext/P2-20.pdf

这可能有效。我看到的一个问题是图像中存在区域,在这些区域中,光线和物体之间根本没有对比度(例如手的左侧)。这可能会导致仅找到必须在之后连接的线段。但它看起来是一个很好的起点。 - Mailerdaimon
谢谢@AMI,我正在按照你的建议进行工作。我有一个问题:我不被允许对图像进行平滑处理! - Engine
是的,这可能需要一些工作。不要使用线性中值滤波器,而是使用矩阵中值滤波器,并进行相应的校准。 - AMY

1
我认为AMI的想法很好。 你也可以考虑使用可控激光源。在这种情况下,您可以获得一组开启激光和关闭激光时的图像对,然后找到它们之间的差异。 这可能会对您有趣:http://www.instructables.com/id/3-D-Laser-Scanner/

我认为AMI的建议很有道理,我正在努力实现。 - Engine

0

这是一个中值滤波器(r=6)输出结果的差值:

result of subtracting a median-filtered image

通过调整中值滤波器半径,您可能可以稍微改善一下情况,但这些波浪形的不连续线条很难可靠地检测到。

您真的需要更好的源图像。以下是一些建议:

  1. 彩色相机会极大地帮助。对红色和绿色通道应用高通滤波器,并计算两者之间的差异。红色线条将更加突出。

  2. 您能让光源更亮吗?

  3. 您尝试在相机镜头上放置红色滤光片了吗?理想情况下,您需要一个尽可能接近光源波长的通带的红色滤光片 - 如果光源来自激光,则适当的二色性滤光片应该能够产生良好的结果。但即使是一张红色塑料片也比没有好。(您有旧的红/蓝3D眼镜吗?)


0
也许从灰度图像中减去红色通道可以突出显示红色。我想把这个作为评论发表,但现在还不能这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接