使用NumPy + Cython加速对比图计算

时间:2018-10-16 17:41:53

标签: python numpy cython

我正在尝试使用NumPy + Cython从以numpy数组形式给出的RGB图像计算对比度图。

按对比图,我的意思是:结果图中的每个像素都是浮点值,该值是通过将输入图像中相应像素与输入图像中所有其他像素之间的颜色值的欧式距离相加得出的在该像素周围的某个特定环境(在本例中为小矩形)中。

我意识到这是一个计算量很大的操作,但我想出的功能却非常缓慢(即,即使输入较小的图像也要以秒为单位运行)。

import numpy as np
cimport numpy as np


cpdef np.ndarray[np.float64_t, ndim=2] contrast_map(
        np.ndarray[np.uint8_t, ndim=3] img, np.int64_t radius = 5):

    cdef np.int64_t width = img.shape[0]
    cdef np.int64_t height = img.shape[1]

    cdef np.ndarray[np.float64_t, ndim=2] result
    result = np.empty((height, width), dtype=np.float64)

    cdef np.ndarray[np.uint8_t, ndim=1] v
    cdef np.float64_t acc

    cdef np.int64_t r, c, r_, c_
    for r in range(height):
        for c in range(width):
            v = img[r, c]

            acc = 0.0
            for r_ in range(max(0, r - radius), min(height, r + radius + 1)):
                for c_ in range(max(0, c - radius), min(width, c + radius + 1)):
                    acc += np.linalg.norm(v - img[r_, c_])

            result[r, c] = acc

    return result / result.max()

我犯了任何会影响性能的错误吗?

此外,我意识到有些库为此类事情提供了现成的功能。这个问题更多是出于教育目的。

0 个答案:

没有答案