图像处理:如何检测图像中的四边形招牌?

信息处理 C# 图像处理
2021-12-19 05:57:34

如何从手机拍摄的图像中检测出四边形招牌?如何检测矩形等形状?圆角矩形(圆角而不是形状角)?

我正在使用 opencv.wrapper 但我是新手。

谢谢。

这是示例: 替代文本 http://www.freeimagehosting.net/uploads/b03442fd36.png

替代文字 http://www.freeimagehosting.net/uploads/e6b36040e8.png

由于那里有噪音和许多线条,我无法确定哪个是招牌的边界线。有时我可以在霍夫变换后找到线条的边界。我被困住了……在这种情况下……

这是从手机相机拍摄的2张原始照片

替代文字 http://www.freeimagehosting.net/uploads/6dbd613edf.jpg 替代文字 http://www.freeimagehosting.net/uploads/720da20080.jpg

我需要你的建议,看看我如何处理图像以取出招牌?

非常感谢

3个回答

您的两个图像都包含许多与您正在寻找的标志无关的线条。其中一些线条比您实际想要的线条更长/对比度更高,因此我认为检测边缘线(例如使用霍夫变换或通过水平/垂直总结对比度)将不起作用。

但是:您正在寻找的标志具有其他应该更容易检测到的特征:

  • 标志背景具有(几乎)恒定的亮度
  • 它占据了图像的相对较大的区域
  • 它靠近图像的中心

所以你正在寻找一个低对比度的大连接区域。我在 Mathematica 中破解了一个概念验证算法。(我不是 OpenCV 专家,但是当我了解它们时,我会提到相应的 OpenCV 功能。)

首先,我使用高斯导数滤波器来检测每个像素的梯度幅度。高斯导数滤波器的孔径很宽(在这种情况下为 11x11 像素),因此它对噪声非常不敏感。然后我将梯度图像归一化为均值 = 1,因此我可以对两个样本使用相同的阈值。

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

OpenCV 实现:您可以sepFilter2D用于实际过滤,但显然,您必须自己计算过滤器内核值

结果如下所示:

梯度幅度

在此图像中,标志背景较暗,标志边框较亮。所以我可以将此图像二值化并寻找暗连接组件。

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

OpenCV 实现:阈值设置应该很简单,但我认为 OpenCV 不包含连接组件分析 - 您可以使用洪水填充或cvBlobsLib

现在,只需在图像中心附近找到最大的斑点并找到凸包(我只是使用了未连接到背景的最大斑点,但这对于每张图像来说可能还不够)。

结果: 在此处输入图像描述 在此处输入图像描述

在这种情况下,您可以采取的另一种对噪声更稳健的方法是生成图像沿 x 轴和 y 轴的平均灰度级曲线。也就是说,计算图像中每一行/列的平均灰度级。

例如,如果招牌(或其边框)比周围环境轻(问题中显示的所有示例都是这种情况),您的 x 轴曲线将有两个峰值(左右和边框) ) 和 y 轴曲线中的两个峰值(用于顶部和底部边框)。使用一维信号的边界检测技术(可能是高通滤波器),您可以推断出招牌的角坐标。

我已经看到这种方法被用于检测车牌和面部识别(鼻子往往是面部较亮的部分,因此它会在 x 轴和 y 轴曲线上产生一个峰值)。

这可能是一个有点颠倒的想法,但可能值得一试。与其尝试检测矩形并将文本视为噪声,也许您可​​以将文本视为信息并使用它来更容易地检测矩形。

这是这个想法的概要:

  • 检测图像中的文本它不需要是一个健壮的实现(你应该能够谷歌一些这样做的小库,或者 OpenCV 有它),只是对图像中文本的粗略估计
  • 找到所有文本检测的中心即使有嘈杂的图像,它也应该在真实的地方
  • 对文本检测周围的区域进行霍夫矩形欺骗也许使用距文本检测中心的中位数距离,或类似的东西。做不同直径,取最强召回

说明及优点:

  • 文本周围的区域通常是同质的——真正的矩形应该是第一个强召回
  • 这样您就不必对整个图像进行霍夫变换,因此您可以更方便地进行变换(可能在同一区域多次但桶大小不同......)