【问题标题】:Image Remap without cropping不裁剪的图像重映射
【发布时间】: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


【解决方案1】:

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

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

第 3 步:使用最大的 blob(因为最大的 blob 是与现实世界正方形相似的最佳 blob)尝试找到 blob 的方向...这可以通过拟合最佳矩形得到,或者你可以得到角点...获取连接它们的线的斜率(水平和垂直方向)。

第 4 步:获得两个斜率后,绘制两条穿过斑点轴的线。对于轴,您可以平均角点,也可以使用质心(质心)...我会使用角点的平均值...

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

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

一些图片支持

【讨论】:

  • 这个方法我知道,但是我觉得我在回答中解释的方法更好(只是一种直觉,没有尝试过),因为在某些情况下,有可能输入图像可能有一些缺陷,如 stackoverflow.com/questions/10196198/… 。所以很难将它们放在一条线上。即为什么我采用重映射方法。
  • 我认为问题图像是您给出的图像...不是数独正方形检测图像...在您的图像中,正方形间距稀疏且颜色不同(其中一些)...所以我相信至少有一个正方形会被显着检测到,当然是橙色或黄色的......(有些地方你还说橙色正方形检测的机会很高......)......所以你的图像中有一个正方形和整个网格都准备好了..!!
  • 嗨,你介意把这个答案发到这里吗:dsp.stackexchange.com/questions/3595/finding-squares-in-image。我在那里呼吁赏金,而你的回答更适合那里。在这里,我对用 remap 方法解决它更感兴趣。如果你能用 dsp.stackexchange 中的一些代码来解释你的答案,那就太好了。
猜你喜欢
  • 2022-01-23
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多