我想识别照片中六角形平铺的边界,如下图所示:



在我看来,在方形网格上采用标准方法首先要检测角点(例如canny),然后通过霍夫变换或类似方法提取最长的线。

这看起来不是十六进制平铺的最佳解决方案,因为外线的长度较短而且很难将它们与其他行分开。

是否有解决此问题的算法?在opencv中有一个解决方案会特别好,但我也对一般想法感兴趣。

update:

使用python和opencv我能够收到此结果:


这是我的代码:

import cv2
import numpy as np

imgOrig = "test1";
img = cv2.imread(imgOrig+".jpg");  
lap = cv2.Laplacian(img, cv2.IPL_DEPTH_32F, ksize = 3)  
imgray = cv2.cvtColor(lap,cv2.COLOR_BGR2GRAY)  
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
size = img.shape
m = np.zeros(size, dtype=np.uint8)
for i, cnt in enumerate(contours):
    if cv2.contourArea(cnt) >= 1:
        color = (255,255,255)
        cv2.drawContours(m, cnt, -1, color, -1)
cv2.imwrite(str(imgOrig)+"contours.jpg", m);


图像的拉普拉斯像:


我将尝试优化此方法的参数,然后尝试对四个部分的边界进行插值。

评论

信号处理符合欧洲博彩标准;我的怪胎感觉刺痛!

如果您始终使用相同尺寸的电路板,并且在图像中始终具有大致相同的电路板视图,那么您就可以解决该问题,就像识别电路板的轮廓以确定尺寸和对齐方式一样简单。瓷砖的放置和大小相对于板的边缘是恒定的,因此一旦知道所有边缘在哪里,就应该能够准确推断出内部瓷砖的位置。

谢谢您的建议,@ nispio。电路板的尺寸始终是相同的,而电路板的外观可能会发生很大变化。其他图片中背景的颜色也不同,这导致对比度大大降低。例如,如果背景为米色,则轮廓的位置很难确定。

如果您没有其他任何答案,我认为将您的修改发布为您自己的问题的一个好主意。我不确定那是如何与赏金互动的!

@snalx:如果您将发现的问题作为答案,我将向您颁发赏金。不过,需要在接下来的12小时内完成。

#1 楼

第一种方法:

根据本教程http://note.sonots.com/SciSoftware/haartraining.html使用opencv的haartraining方法-这应该给出最佳结果,但是我没有到目前为止,我一直在与训练自己进行合作...

第二种方法:

我建议使用“无标记跟踪”方法对木板的各个砖块进行处理。您也可以使用OpenCV来实现。.

准备工作


为此,您需要一些每种类型的瓷砖的照片。拍摄所有图块类型的图片(每张图作为一张图),并在图片中间使用自顶向下视图图块的均匀背景。
然后使用某些特征检测器(OpenCV为此使用多种算法,但是SIFT / SURF是非自由算法;我建议使用“ FAST”)在图像中找到明显的点。
使用特征描述符描述图像中发现的特征(例如使用“ BRIEF”) 。

检测

现在,您可以通过对图像应用相同的特征检测器/描述符算法来检测图像中的图块。获得功能部件/描述符后,可以应用FlannBasedMatcher查找图块。

这是来自OpenCV的代码示例/教程:
http://docs.opencv.org/ doc / tutorials / features2d / feature_homography / feature_homography.html#feature-homography

注释

匹配器方法只会给您一个匹配项,如果在板上找到了多个这种类型的图块,则可能会出现问题。您可以通过仅遮盖输入图像的某些部分来解决该问题。我建议使用检测到的特征的像素坐标进行此操作。如果您以某种方式首先检测了图块的轮廓和大小,则可以粗略估计图上图块的位置和大小。匹配之前,先过滤检测到的特征列表(例如,仅在距图块预期中点x像素半径以内的特征),然后使用最强匹配。结果,您将获得图块在图像上的确切位置(包括其方向)。如果检测地图轮廓太复杂,可以让用户“指向”角落的瓷砖以手动标记轮廓...

替代方法

您可以也可以使用此方法通过其轮廓查找任何平铺图片。绘制一个样本的“示意图”灰度图(六边形),上面没有任何图像。请注意,此图像中的“深色”和“浅色”区域在原理图中需要正确,而不仅仅是一些“线条”。
您可能需要尝试一下。您可以尝试对不同图块的多张照片求平均,以生成图块的“平均”图像。确保拐角处在同一位置(相应地移动/缩放图片),并在完成后锐化图片(清晰的拐角/边缘应可见),并根据需要稍微调整对比度。

评论


$ \ begingroup $
感谢您的建议@StefanK。我有点担心如果将游戏块(房屋)放在瓷砖上,第一种和第二种方法是否仍然有效。您选择的替代方法看起来很麻烦,我会尝试一下(也许经过一些预处理)。
$ \ endgroup $
–nalx
2013年8月26日14:58



$ \ begingroup $
在大多数情况下,似乎可以检测到外线。我最近在与问题最终结果相似的图像上使用了Hough transfom进行了尝试。找到稳定的解决方案后,我将更新我的问题。
$ \ endgroup $
–nalx
13年8月26日在15:01

$ \ begingroup $
瓷砖上的房屋和其他游戏物件应该没有问题。这将导致某些“功能”被覆盖,但是其中一些仍将被检测到。至少需要检测4个。您可以尝试opencv的功能检测演示,并查看每个磁贴上检测到了多少个功能...
$ \ endgroup $
–SDwarfs
13年8月30日在15:22

#2 楼

我将描述我目前的方法,该方法是利用游戏规则,图像处理和特征检测的组合。

相关游戏规则


位置图块,城堡和不能通过游戏令牌(房屋)上山
在8种情况下,有7种也不能用水
有8种不同(独特)的区域,另外还有8种通过旋转180度(看到可能的部分图片

完整的游戏规则可以在这里找到。

实现

首先,我使用霍夫变换来提取游戏板的位置。源图像看起来像最终的图像,但是线条较粗,并且过滤了较小的边界,我仅使用检测很长的线条(数量级:大约图像宽度/高度的60%)和很小的线条匹配阈值。我还只是查看图像外部40%处的线,并以检测到的线的中值分别位于顶部,底部,左侧和右侧,结果如下图所示:


我只需要一个大概的近似值,所以这很好。从现在开始,我仅检查Houghlines内的图像,以及由于Hough变换的不确定性而导致的一些额外空间。

然后,我使用Stefan K.在其答案中提出的特征检测来检测特征。在图像中,玩家无法拍摄到,例如城堡,位置图块和山脉。我在opencv-python中使用ORB算法来执行此操作,并在BruteForce-Hamming-Matcher中进行了操作(我还无法使FlannBased匹配器运行)。 ORB是缩放和旋转不变的。为了检测多次出现的相同要素(例如城堡),我将图像分成了重叠的部分。只要图像分辨率足够大并且直接从顶部拍摄照片(仍然需要进行一些测试),此方法就可以正常工作。这也有点慢。下图显示了位置图块(酒馆)的检测示例。


目前,我尝试找到homographyTransform来提取检测到的特征的精确位置和方向。

我希望能够根据这些信息(山脉,城堡,位置瓷砖以及大多数情况下的水)重建网格。当前的实验看起来很有希望,尽管必须进行许多微调和适当准备特征图像。

评论


$ \ begingroup $
我已经使用Catan做过类似的事情,但是我没有使用全息照相术,而是使用任何给定图块的平均颜色值。通过预处理将瓷砖识别为6面多边形轮廓,以帮助隔离边缘,然后将ROI转换为蒙版,然后使用bitwise_and在源图像上应用蒙版。然后,您可以获得平均颜色,该颜色足以识别大多数图块,然后可以执行其他图案匹配。我刚刚开始:youtube.com/watch?v=0ezfyWkio6c
$ \ endgroup $
–雷克斯·哈丁(Rex Hardin)
17年7月11日在18:40