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


14

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

我正在使用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

我需要您的建议,以查看如何处理图像以将招牌拿出来?

非常感谢你


2

是的,霍夫变换FTW!

但是图像中有噪点,我如何找出招牌的边界

@ xabi123:霍夫变换,阈值,读出边界

1
您可以分享样本图片吗?

Answers:


7

您的两个图像都包含许多与您要查找的符号无关的行。而且其中一些线比您实际想要的线更长/具有更高的对比度,因此我认为检测边缘线(例如,使用霍夫变换或通过水平/垂直汇总对比度)将无法工作。

但是:您正在寻找的标志还有其他特征,应该更容易发现:

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

因此,您正在寻找对比度低的大连接区域。我在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不包含连接的组件分析-您可以使用泛洪填充或 Fill cvBlobsLib

现在,只需找到图像中心附近的最大斑点并找到凸包(我只是使用了未与背景相连的最大斑点,但这可能不足以容纳所有图像)。

结果: 在此处输入图片说明 在此处输入图片说明


0

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

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

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


嗯..如果旋转招牌或转动相机怎么办?
Mustafa

0

这可能是一个颠倒的想法,但可能值得尝试。不必尝试检测矩形并像噪音一样思考文本,也许您可​​以像对待信息一样对待文本并将其用于检测矩形。

这是想法的概要:

  • 检测图像中的文字。它不需要是一个可靠的实现(您应该能够在Google小型谷歌库中做到这一点,或者OpenCV拥有它),而只是对图像中文本的粗略估算
  • 找到所有文本检测的中心。即使有嘈杂的图像,它也应该在真实的地方
  • 在文本检测周围的区域上执行Hough矩形检测。也许使用距文本检测中心的中间距离,或类似的方法。做不同的直径并进行最强烈的召回

的解释和优点:

  • 文字周围的区域通常是同质的-真正的矩形应该是第一个强烈的回忆
  • 这样,您就不必对整个图像进行霍夫变换,因此您可以做得更透彻(可以在同一区域进行多次,但使用不同的存储桶大小...)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.