OpenCV中的图像转换
computer-vision
opencv
python
7
0

这个问题与这个问题有关: How to remove convexity defects in sudoku square

我正在尝试在Mathematica to OpenCV-Python实现nikie's answer 。但是我陷入了程序的最后一步。

即我将所有相交点都放在正方形中,如下所示:

在此处输入图片说明

现在,我想将其转换为大小为(450,450)的完美正方形,如下所示:

在此处输入图片说明

(不要管两个图像的亮度差异)。

问题:如何在OpenCV-Python中执行此操作?我正在使用cv2版本。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

除了etarion的建议外,您还可以使用remap函数。我写了一个快速脚本来展示如何做到这一点。如您所见,编码在Python中非常容易。这是测试图像:

影像失真

这是变形后的结果:

扭曲的图像

这是代码:

import cv2
from scipy.interpolate import griddata
import numpy as np

grid_x, grid_y = np.mgrid[0:149:150j, 0:149:150j]
destination = np.array([[0,0], [0,49], [0,99], [0,149],
                  [49,0],[49,49],[49,99],[49,149],
                  [99,0],[99,49],[99,99],[99,149],
                  [149,0],[149,49],[149,99],[149,149]])
source = np.array([[22,22], [24,68], [26,116], [25,162],
                  [64,19],[65,64],[65,114],[64,159],
                  [107,16],[108,62],[108,111],[107,157],
                  [151,11],[151,58],[151,107],[151,156]])
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(150,150)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(150,150)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')

orig = cv2.imread("tmp.png")
warped = cv2.remap(orig, map_x_32, map_y_32, cv2.INTER_CUBIC)
cv2.imwrite("warped.png", warped)

我想你可以用谷歌搜索并找到griddata的作用。简而言之,它会进行插值,在这里我们将其用于将稀疏映射转换为密集映射,因为cv2.remap需要密集映射。由于OpenCV抱怨float64类型,我们只需要将其转换为float32的值即可。请让我知道如何。

更新 :如果您不想依赖Scipy,一种方法是在代码中实现2d插值功能,例如,在Scipy中查看griddata的源代码或更简单的代码,例如http://inasafe.readthedocs .org / en / latest / _modules / engine / interpolation2d.html仅取决于numpy。虽然,我建议为此使用Scipy或其他库,尽管我明白为什么对于这种情况,仅要求CV2和numpy可能会更好。我想听听您的最终代码如何解决Sudokus。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号