在图像中找到正方形


34

我需要使用OpenCV在图像中找到正方形(在matlab或其他任何问题上都没问题,通常我期望的是一些想法)。

考虑下面的测试图像:

在此处输入图片说明

我需要在上面的图像中准确找到那些彩色的正方形(而不是白色的长条)。

我做了什么 :

  • 我应用了通用方法(OpenCV样本随附),即在所有颜色平面中找到轮廓,对其进行近似并检查元素数= 4。它在某种程度上可以检测到很少的正方形,尤其是暗的正方形。

  • 我要做的下一步是预测。即这种安排是固定的。因此,如果获得一些,我可以预测剩余的。它还可以进一步扩展。但是准确性非常差。

但是我觉得这里的预测不是一个好方法,并且它并不总是提供第一步所给出的准确答案。

我需要的 :

1)还有其他更好的方法可以更准确地检测这些正方形吗?还是多种方法?

重要的一点是,时间在这里不是问题。算法可能很慢,没关系。但是准确性是主要标准。

有时,图像可能更加模糊。

我面临的主要问题之一是某些正方形的颜色与背景颜色几乎相似(请检查第3列的第一和第二个正方形)。

寻找想法,在此先感谢

更新:

以下是我得到的最大准确结果:

在此处输入图片说明

当然,结果图像的大小会有所调整。

更新2:

我在下面的答案中给出了更好的解决方案:https : //dsp.stackexchange.com/a/7526/818


你的背景总是发白吗?

1
我的想法是计算饱和度并确定饱和度img的阈值,但使用您的示例效果不佳(将饱和度计算为max(RG,RB,GB)。有些正方形看起来几乎像背景,如果您的所有图像都具有相同的模式(白色长条纹旁边带有正方形),则应考虑查找最简单的位(例如,真正彩色的正方形或白色条纹),以推断出其他图像的可能位置。广场和...找到一个方法来检查它们是否真的存在或者not.Tough但有趣的,你能不能给更多的图像!?

好吧,我认为这不应该被感动。
Junuxx 2012年

1
您可以提供更多图片吗?还有,这是什么东西?
Andrey Rubshtein 2012年

2
OP需要回答一些问题。也许不需要白色背景。那光怎么了?会那么糟糕吗?这些对我来说似乎只是不必要的复杂性。
泰成

Answers:


9

使用Matlab的首次尝试:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

结果在以下地区:

标记区域

如您所见,选择导致最高区域数(T = 120)的阈值将已经给出7个正确位置,一些合并位置,一个假阳性和两个假阴性。

这是一个相当简单的尝试,但我认为它表明该方法有效。添加一些东西来分解拉长的区域,或者分别对每个颜色通道执行此操作,只是您可以做的一些改进。

如果您再提供一些测试图像,也将有所帮助。


8

我尝试了其他方法来改善相关结果。下面的解决方案基于在步骤1中始终检测到第一个正方形(橙色)的假设。由于与背景相比,它的对比色高,因此很实用。即使我有问题的结果也已正确检测到

第1步:找到尽可能多的正方形

我将图像拆分为R,G,B,H,S,V平面,并针对不同阈值(例如25的倍数)对图像进行阈值处理。对于每个图像,我都在其中找到了正方形,然后将它们放在“蒙版图像”上。我还发现了正方形的平均高度和宽度。

遮罩图像(共检测到7/12个正方形):

遮罩图像

第2步:形成正方形网格

接下来,我在蒙版图像中找到了这些正方形的质心。对它们进行排序,找到第一个正方形(橙色)的质心。通过仔细分析,我们可以看到两个正方形之间的间隙在水平和垂直方向都是正方形。因此,通过这种方式,我像下面那样制作了一个正方形网格,并将其称为Ideal_squares(这只是一个名称,并不意味着这就是我需要的输出):

Ideal_squares:

理想的形象

第3步:重新映射Ideal_Image

现在我们有了ideal_squares重心和原始重心。我从ideal_centroids中找到了每个原始质心的正确匹配项(通过计算它们之间的欧几里得距离)。然后,我使用Scipy interpolate.griddata进行插值,并根据质心值重新映射了Ideal_image(这与这些Q&A中的变形几乎相同:如何消除数独正方形中的凸度缺陷OpenCV中的图像变换)。所以下面是我得到的输出:

输出:

输出图像

步骤4:或对第一步的蒙版图像进行以上输出操作

最终输出

现在您可以看到检测到所有正方形,但是存在以下问题:

问题:

查看步骤3的输出,即正方形网格的重新映射图像。除两个中心正方形外,所有其他正方形均被裁剪。这是与此重新映射相关的问题。我不确定scipy.interpolate.griddata()或cv2.remap()的问题在哪里。我以为整个形象会变形,但事实并非如此。它仅扭曲我们给出的质心内的图像。如果我可以纠正这一点,输出将正常。

因此,如果有人知道一个好主意,那就欢迎您!!!


5

注意:此方法将非常慢。

生成看起来像理想对象轮廓的蒙版。与此类似:

对象的遮罩

然后在图像上滑动(位置,比例,旋转)蒙版,并将其与真实图像的轮廓匹配(可能稍微模糊以得到更柔和的响应),以计算它们的相似度(位置,比例,旋转)最高相似度响应应该是真实对象的(位置,比例,旋转)。

该方法不考虑将正方形混合到对象的背景或什至部分遮挡中,因为它考虑了整个对象。

我个人成功地使用了这种方法来跟踪鼠标的鼻子和胡须,但是我有一些假设,例如它接近最后一个已知位置等。但是我认为您可以通过应用一些假设来降低搜索空间,例如:可能的大小相机中物体的角度,物体距中心的距离或旋转角度小于10度等。


5

步骤1:无论您在B,G,R,H,S,V平面中进行分析得到的最终最终二进制图像是什么,在该图像中都进行斑点计数算法。

步骤2:根据面积或轮廓长度找到最大的斑点。由于您的斑点主要是平行四边形类型,所以面积或轮廓都可以,所以任何人都可以。

步骤3:使用最大的Blob(因为最大的Blob是类似于您的现实世界正方形的最佳Blob),尝试找到Blob的方向...这可以通过拟合最佳拟合矩形来获得,也可以获取角点...获得连接它们的直线的斜率(水平和垂直方向)。

第4步:一旦获得两个斜率,就绘制了一条穿过Blob轴的直线。对于轴,您可以平均拐角点,也可以使用质心(质心)...我将平均拐角点...

第5步:由于在每个水平和垂直方向上的间距都是相等的(理想情况下水平和垂直间距也相等,因为它来自理想的方形图片,但我们不会假设它是..),只需找到另一个的可能质心平行四边形

底线:如果可以完美地检测到任何一个正方形,则可以制作整个网格。沿最大斑点的水平轴保持标记中心的间隔为2H(H =最大斑点的水平宽度),沿垂直于斑点的垂直轴的间隔为2V(V =最大斑点的垂直高度)。

一些照片支持 在此处输入图片说明

在此处输入图片说明


1
+1-如果可以实施,那就太好了。
阿比德·拉赫曼

2
@AbidRahmanK这不是StackExchange的目的。问题->答案。否则,这最终将成为招聘会。
JanKrüger'16

2

这种安排是固定的

我真的不知道您之前做了什么样的预测,但是您是否试图将白色长条作为根源。然后(如果3列正方形大小相等),则可以检测正方形的高度(两个条带之间的距离),并且可以检测图像中的最大和最小面积(高度和宽度)。

然后,尝试检测整个正方形内最普通的颜色并将其设置为“非正方形”区域。其余的应该是您要寻找的正方形。


我使用轮廓法发现了3-4个正方形。然后得到每个正方形的高度和宽度。然后检查检测到的正方形之间的间隙,并假设它们之间的间隙是否大到足以容纳另一个正方形。那是我所做的预测。
阿比德·拉曼

一些正方形的颜色几乎与背景颜色相似。因此,按照您的方法,它们也将被视为非正方形区域。
阿比德·拉赫曼

也许您可以尝试在每一列上绘制一条曲线,其中x轴为图像中的高度(以像素为单位),y轴为强度。然后,您可以尝试使用导数形式找到一些切削刃。

那就是边缘检测本身,对不对?我试过了,但是没有得到很好的结果。
阿比德·拉赫曼

1
是的,但是您可以自己查看失败的原因,并可以隔离出图中一些有趣的区域。顺便说一句,如果您找到解决问题的有用技巧,请发布它们。祝您研究工作

0

我建议使用霍夫变换,这是一种非常健壮的算法,可用于查找简单的参数形状,例如直线,圆等。在您的情况下,最好检测直线。您至少可以找到白色长条的侧面;然后,使用任何角点提取器算法(Harris甚至SIFT或SURF),您都可以沿着这些直线找到角点,即使使用正方形的等距间距也是如此。


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.