【发布时间】:2012-12-29 21:45:07
【问题描述】:
这是这个问题的延续: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)
还添加了centroids、match_pts等数据,如果有人想尝试一下,可以直接使用数据而不是从图像中查找:gist.github.com/4540887
【问题讨论】:
-
愿意分享代码吗?我的猜测是你在他的代码中犯了一个小错误/一个小的更正修复了......
-
@Shambool:添加代码
-
这条评论只是几乎不相关,因为我根本没有读过这个问题,因为在阅读了链接答案的开始考虑之后,我不确定为什么它认为你的这张顶级图片问题是使用好的方法获得的。例如,如果你有这张图片:i.imgur.com/fBFAM.png,它会让事情变得更容易吗?
-
链接的问题其实是在SOF这里问的,最后迁移到dsp。由于没有更好的答案,我开始赏金。因此,如果您有任何好的方法,请随时在此处发布您的答案。从你的图片来看,我认为这可能是一个很好的解决方案,如果你能解释一下如何实现它。
-
请那些对问题投反对票的人发表评论,这个问题有什么问题。
If I don't know the problem, how can I improve it?
标签: matlab image-processing opencv computer-vision scipy