Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 无裁剪的图像重映射_Matlab_Image Processing_Opencv_Computer Vision_Scipy - Fatal编程技术网

Matlab 无裁剪的图像重映射

Matlab 无裁剪的图像重映射,matlab,image-processing,opencv,computer-vision,scipy,Matlab,Image Processing,Opencv,Computer Vision,Scipy,这是这个问题的延续: 我按照我的答案中的步骤:,我得到的答案如下: 但在回答的最后,我解释了一个问题,这就是我的问题 说明: 在上一个链接中,我已经有了步骤1中检测到的正方形的质心(这些检测到的正方形在下面的mask_图像中标记): 我创建了一个网格图像,如下所示(我也知道它们的质心值): 我还发现网格图像中的哪个点要映射到mask_u图像中的对应点 有了这些信息,我应用了scipy.interpolate.griddata(),然后是OpenCV的cv2.remap()函数 其结果如下所

这是这个问题的延续:

我按照我的答案中的步骤:,我得到的答案如下:

但在回答的最后,我解释了一个问题,这就是我的问题

说明:

在上一个链接中,我已经有了步骤1中检测到的正方形的质心(这些检测到的正方形在下面的mask_图像中标记):

我创建了一个网格图像,如下所示(我也知道它们的质心值):

我还发现网格图像中的哪个点要映射到mask_u图像中的对应点

有了这些信息,我应用了scipy.interpolate.griddata(),然后是OpenCV的cv2.remap()函数

其结果如下所示:

正如您所看到的,除中心的两个正方形外,所有的正方形都被剪裁。就像,输出仅包含连接遮罩图像所有质心的边界内的区域

下面的场景变得更糟:

当在第一步中未检测到四个角的最后一个正方形(黄色)或任何其他正方形时,情况更糟。考虑最后一个没有检测到。下面是我得到的结果,你可以看到底部有一个斜切(用黄色标记):

问题:

为什么重映射函数在我给出的点之外不起作用?我应该怎么做才能在不剪切的情况下重新映射它

我认为即使我给出了一些不在边缘的点,它也可以用于完整的图像

预期产出:

下面是我在操作结束时预期的输出。(红色边界内的区域是我现在实际得到的)

寻找一些好的建议

更新:

我还在这里添加代码。只添加了重新映射的零件代码。完整代码太大,无法在此处添加:

# 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)

还添加了质心、匹配点等数据,这样如果有人想尝试,他们可以直接使用数据,而不是从图像中查找数据:

步骤1:在B、G、R、H、S、V平面中分析得到的任何最终二值图像,在该图像中执行斑点计数算法

步骤2:根据面积或轮廓长度找到最大的斑点。因为你们的斑点大多是平行四边形,所以面积或轮廓,任何一个都可以

步骤3:使用最大的水滴(因为最大的水滴是与现实世界中的正方形相似的最佳水滴),尝试找到水滴的方向…这可以通过拟合最佳拟合矩形或获取角点…获取连接它们的线的坡度(水平方向和垂直方向)

步骤4:获得两个坡度后,绘制两条穿过水滴轴的直线。对于轴,你可以平均角点,或者你可以使用质心(质心)…我会用平均角点

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

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

要支持的一些图片


想分享一下代码吗?我的猜测是你在代码中犯了一个小错误/一个小的更正修复了…@Shambool:添加了代码这条评论仅仅是无关紧要的,因为我根本没有读过这个问题,因为在阅读了链接答案的开始注意事项后,我不确定为什么会认为你的问题获得了这个顶级图像使用好的方法。例如,如果你有这样的图像:,它会使事情变得更容易吗?这个链接的问题实际上是在软件中提出的,最后转移到了dsp。因为没有更好的答案,我开始赏金。因此,如果你有任何好的方法,请随意在那里张贴你的答案。从你的形象来看,我认为这是一个很好的解决方案,如果你能解释一下如何实施它的话。请那些否决这个问题的人评论一下这个问题有什么问题
如果我不知道这个问题,我如何改进它?
这个方法我知道,但我觉得我在回答中解释的方法更好(只是直觉,没有尝试过),因为在某些情况下,输入图像可能有一些缺陷,如中所示。所以很难把它们放在一条线上。ie为什么我选择重映射方法。我假设问题图像是您给出的图像…不是数独方块检测图像…在您的图像中,方块间隔稀疏,颜色不同(其中一些)…因此我相信至少会检测到一个方块,当然是橙色或黄色的方块。。。(有些地方你也说橙色方块被发现的几率很高……)…因此,您的图像中的一个正方形和整个网格都已准备就绪。!!嗨,您介意将此答案发布到此处吗:。我已在那里呼吁悬赏,您的答案更适合那里。在这里,我更感兴趣的是使用重映射方法解决此问题。如果您能在dsp.stackexchange中用一些代码解释您的答案,那就太好了。