这是此问题的延续: Finding Squares in Image
我按照我的回答中的步骤:https://dsp.stackexchange.com/a/7526/818,我得到了以下答案:
但在答案结束时,我已经解释了一个问题,那就是我的问题。
说明:
我已经拥有上一个链接中步骤1中检测到的方块的质心(并且这些检测到的方块在下面的mask_image中标记):
我创建了一个网格图像,如下所示(我也知道它们的质心值):
我还发现网格图像中的哪个点要映射到mask_image中的对应点。
有了这些信息,我应用了 scipy.interpolate.griddata(),然后应用了OpenCV的cv2.remap()函数。
结果如下:
如您所见,除中心两个以外的所有方格都被剪裁。就像,输出只包含绘制连接mask_image的所有质心的边界内的区域。
下面的场景变得更糟:
在第一步中未检测到最后一个方格(黄色)或四个角中的任何其他方格时,情况更糟。考虑最后一个未检测到。然后下面是我得到的结果,你可以看到底部的斜切(标有黄色):
问题:
为什么重映射功能不能超出我给出的分数?我该怎么做才能重新映射而不剪裁?
我认为即使我提供了一些不在边缘的点,它也能用于完整的图像。
预期产出:
以下是我在操作结束时预期的输出。 (红色边界内的区域是我现在实际得到的)
寻找一些好的建议......
更新:
我也在这里添加代码。仅添加重新映射部件代码。完整代码太大了,不能在这里添加:
# ideal - the grid image - http://i.stack.imgur.com/3QudG.png
# centroids - list of centroids of the squares in mask_image - http://i.stack.imgur.com/jh6bQ.png
# match_pts - list of centroids of the squares in grid image corresponding to squares in mask_image
# warped - the final image obtained after remap - http://i.stack.imgur.com/O26ZA.png
grid_x,grid_y = np.meshgrid(np.arange(ideal.shape[1]),np.arange(ideal.shape[0]))
dst = np.array(centroids)
src = np.array(match_pts)
grid_z = griddata(dst,src,(grid_x,grid_y),method='cubic')
map_x_32 = grid_z[:,:,0].astype('float32')
map_y_32 = grid_z[:,:,1].astype('float32')
warped = cv2.remap(ideal, map_x_32, map_y_32, cv2.INTER_CUBIC)
还添加了像质心,match_pts等数据,这样如果有人想要尝试,他们可以直接使用数据而不是从图像中找到它: gist.github.com/4540887
答案 0 :(得分:2)
步骤1:无论您从B,G,R,H,S,V平面分析得到的最终二进制图像是什么,都会在该图像中执行blob计数算法。
步骤2:根据面积或轮廓长度找到最大的斑点。由于你的blob主要是平行四边形类型,所以区域或轮廓,任何人都可以。
步骤3:使用最大的blob(因为最大的blob是类似于你的真实世界方块的最佳blob),试着找到blob的方向...这可以通过拟合最合适的矩形来获得或者你可以获得角点...获得连接它们的线的斜率(在水平和垂直方向)。
步骤4:一旦得到两个斜坡,绘制两条穿过blob轴的线。对于轴你可以平均角点或你可以使用质心(质心)...我会去角点的平均值...
步骤5:由于在每个水平和垂直方向上,间距相等(理想水平和垂直间距也相等,因为它来自您理想的方形图片,但我们不会假设它...)只需要找到可能的质心其他平行四边形
BOTTOM LINE:如果完全检测到任何一个方格,您可以制作整个网格。只是沿着最大斑点的水平轴保持标记中心的间隔为2H(H =最大斑点的水平宽度),并沿着斑点的垂直轴垂直地以2V的间隔(V =最大斑点的垂直高度)。
支持的一些照片