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

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

我需要ya的建议以了解如何处理图像把招牌拿出来?

非常感谢

评论

关键字:opencv,霍夫变换重复项:stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

是的,霍夫变换FTW!

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

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

您可以分享示例图片吗?

#1 楼

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

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


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

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

现在,只需在图像中心附近找到最大的Blob,然后找到凸包(我只是使用了未连接到的最大Blob背景,但可能不足以显示每张图片。

结果:


#2 楼

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

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

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

评论


$ \ begingroup $
嗯..如果旋转招牌或转动相机怎么办?
$ \ endgroup $
–穆斯塔法
2012年7月26日15:56

#3 楼

这可能是一个颠倒的想法,但可能值得尝试。也许您可以像对待信息一样对待文本,并使用它来更容易地检测矩形,而不是尝试检测矩形并像噪音一样思考文本。

这里是概念的提要:



检测图像中的文本。它不必是一个可靠的实现(您应该可以在Google小型谷歌库中做到这一点,或者OpenCV可以做到这一点),只需大致估算图像中的文本

所有文本检测的中心。即使有嘈杂的图像,它也应该在真实的地方。

在文本检测区域周围进行霍夫矩形检测。也许使用距文本检测中心的中间距离,或类似的方法。进行不同的直径处理并获得最强烈的回忆。

解释和优点:


文本周围的区域通常是同质的-实际矩形应为第一次强烈的回忆
这样,您就不必对整个图像进行霍夫变换,因此您可以通过更多的方式做到这一点(也许在同一区域进行了多次变换,但是铲斗尺寸不同...)