基于给定矩阵在openCV中构造矩阵

时间:2013-08-11 10:17:22

标签: c++ python opencv computer-vision

我正在使用Python中的OpenCV库编写一些代码。在这个过程中,我需要根据给定的另一个矩阵构造一个矩阵。现在我的代码如下所示:

for x in range(0, width):
    for y in range(0, height):
        if I_mat[x][y]>=0 and I_mat[x][y]<=c_low:
            w_mat[x][y] = float(I_mat[x][y])/c_low
        elif I_mat[x][y]>c_low and I_mat[x][y]<c_high:
            w_mat[x][y] = 1
        else:
            w_mat[x][y] = float((255-I_mat[x][y]))/float((255-c_high))

其中, I_mat 是输入矩阵, w_mat 是我要构建的矩阵。由于输入矩阵非常大,因此该算法非常慢。我想知道是否还有其他方法可以更有效地构建 w_mat 。非常感谢!

(没有必要在Python中显示解决方案。)

1 个答案:

答案 0 :(得分:0)

编辑:您可能想要使用numba

import numpy as np
import timeit
from numba import void,jit

c_low = .3
c_high = .6
def func(val):
    if val>=0 and val<=c_low:
        return float(val)/c_low
    elif val>c_low and val<c_high:
        return 1.
    else:
        return (255.-val)/(255.-c_high)

def npvectorize(): 
    global w_mat
    vfunc = np.vectorize(func)
    w_mat = vfunc(I_mat)

def orig():
    for x in range(I_mat.shape[0]):
        for y in range(I_mat.shape[1]):
            if I_mat[x][y]>=0 and I_mat[x][y]<=c_low:
                w_mat[x][y] = float(I_mat[x][y])/c_low
            elif I_mat[x][y]>c_low and I_mat[x][y]<c_high:
                w_mat[x][y] = 1
            else:
                w_mat[x][y] = float((255-I_mat[x][y]))/float((255-c_high))

I_mat = np.array(np.random.random((1000,1000)), dtype = np.float)
w_mat = np.empty_like(I_mat)

fast = jit(void(),nopython=True)(orig)

print timeit.Timer(fast).timeit(1)
print timeit.Timer(npvectorize).timeit(1)
print timeit.Timer(orig).timeit(1)    

输出:

0.0352660446331
0.472590475098
4.78634474265