这个问题与这个问题相关:<代码>如何消除数独方块中的凸性缺陷
我试图在Mathematica中将nikie的答案实现到OpenCV Python中。但我被困在程序的最后一步。
IE我得到了所有的交叉点在正方形如下:
现在,我想将其转换为一个完美的正方形(450450),如下所示:
(不要介意两幅图像的亮度差异)。
问题:如何在OpenCV Python中做到这一点?我正在使用cv2版本。
如果您有源点和终点(您只需要4个),您可以将它们插入cv2。getPerspectiveTransform,并在cv2中使用该结果。warpPerspective。给你一个很好的平淡的结果。
除了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需要密集映射。我们只需要将值转换为flat32,因为OpenCV抱怨flat64类型。请告诉我进展如何。
更新:如果您不想依赖Scipy,一种方法是在代码中实现2d插值函数,例如,请参阅Scipy中griddata的源代码或类似的简单代码http://inasafe.readthedocs.org/en/latest/_modules/engine/interpolation2d.html这只取决于numpy。尽管如此,我还是建议使用Scipy或其他库来实现这一点,尽管我明白为什么对于这样的情况,只需要CV2和numpy可能更好。我想听听你的最终代码是如何解决数独的。
给定BGR格式的尺寸数组(宽度、高度、3),如何将此图像转换为sRGB空间?OpenCV()不实现此转换,也不实现对sRGB的任何转换。 我进行了一些研究,找不到任何函数做到这一点,甚至找不到一个我可以遵循的公式来实现我自己的函数。 有什么建议或指导吗?而为什么这种转型在互联网上是一件如此隐晦的事情呢?
问题内容: 如何将灰度OpenCV图像转换为黑白图像?我看到已经提出了类似的问题,但是我使用的是OpenCV 2.3,建议的解决方案似乎不再起作用。 我正在尝试将灰度图像转换为黑白图像,以便不是绝对黑色的任何东西都是白色,并将其用作surf.detect()的蒙版,以便忽略在黑色蒙版区域边缘上找到的关键点。 下面的Python几乎可以解决我的问题,但是发送到Threshold()的阈值似乎没有任何
问题内容: 我想将图像的颜色基础从RGB更改为其他颜色。我有一个要应用于每个像素的RGB的矩阵M,我们可以将其定义为x ij。 我目前正在迭代NumPy图像的每个像素并手动计算Mx ij。我什至无法对它们进行矢量化处理,因为RGB是1x3而不是3x1数组。 有一个更好的方法吗?也许是OpenCV或NumPy中的函数? 问题答案: 记不清执行此操作的规范方法(可能避免了转置),但这应该可行: 如果是
问题内容: 我想加载彩色图像,将其转换为灰度,然后反转文件中的数据。 我需要的是:遍历OpenCV中的数组并使用此公式更改每个值(这可能是错误的,但对我来说似乎很合理): 但我不明白为什么它不起作用: 我不想做一个显式循环(我想变得更pythonic)。我可以看到,在一张具有白色背景的图像中,它变成了黑色,但是仅此而已,就好像其他颜色并没有太大变化(如果有)。 问题答案: 您几乎做到了。由于您是一
@subpage tutorial_py_fourier_transform_cn 学会找到图像的傅里叶变换。
主要内容:将彩色图像转换为灰度在前面的章节中,我们讨论了如何读取不同类型的输入图像(二进制,灰度,BGR等)。 在本章中,我们将学习如何将一种图像转换为另一种图像。 包中名为的类提供了将图像从一种颜色转换为另一种颜色的方法。 将彩色图像转换为灰度 使用方法将彩色图像转换为灰度。 以下是此方法的语法。 该方法接受以下参数 - src - 表示来源的矩阵。 dst - 表示目的地的矩阵。 code - 表示转换类型的整数代码,例如