使用像素数组

时间:2017-09-28 15:46:42

标签: python arrays opencv numpy numpy-broadcasting

试图在OpenCV中对单应矩阵进行前向扭曲。你不必知道这意味着什么才能理解这个问题。

假设有2个图像(图像是像素值的2D Numpy数组),A和B,以及看起来像

的数组match
[[  6.96122642e+01  -1.06556338e+03   1.02251944e+00] 
 [  6.92265938e+01  -1.06334423e+03   1.02246589e+00]
 [  6.88409234e+01  -1.06112508e+03   1.02241234e+00]
 ... ]

第一列是X,第二列是Y,第三列是标量。这些XY值是图像A像素索引并且对应于imageB索引

[[0,0], 
 [0,1], 
 [0,2]
 ... ]

我想使用此信息从imageA快速设置imageB值。我有这个工作,但它没有我喜欢

那么快
yAs = np.int32(np.round( match[:, 0] / match[:, 2] )
xAs = np.int32(np.round( match[:, 1] / match[:, 2] )
it = np.nditer(pixelsImageB[0], flags=['f_index'])
while not it.finished:
    i = it.index    
    xA = xAs[i]
    yA = yAs[i] 
    if in_bounds(xA, yA, imageA):
        yB = pixB[0][i]
        xB = pixB[1][i] 
        imageB[xB,yB] = imageA[xA,yA]

    it.iternext()

但是我不确定如何在Numpy中快速实现这一点,天真地做这个循环非常慢。我在高级索引,广播等方面完全磨砂。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最快的方法是不重新发明轮子并使用cv.WarpPerspective功能。

或者,您可以使用Pillow Image.transform方法,根据文档,它比OpenCV略有优势,因为它还支持双三次插值,这样可以产生更好质量的输出。