Opencv python:对每个像素应用任意函数而不进行迭代

时间:2016-01-28 05:33:36

标签: python opencv numpy

在使用python的opencv中是否有办法在利用numpy优化的同时将任意函数应用于图像中的每个像素?

例如,我想获得单通道图像的sigmoid:

out_image[:,:] = 1 / (1 + math.exp(-in_img[:,:]))

但这不起作用(毫不奇怪):TypeError: only length-1 arrays can be converted to Python scalars

有没有办法哄骗numpy做这样的事情?

我当然可以迭代像素,这在C ++中可能会很好,但在python中它很慢。

1 个答案:

答案 0 :(得分:3)

正如@Divakar所建议的那样,取代仅math.exp了解numpy.exp的标量ndarray的{​​{1}}是了解in_img = numpy.random.random((1000, 1000)) 的方法。

作为旁注,一些基准:

%timeit (1 / (1 + numpy.exp(-in_img[:,:])))

在CPython中:

import numexpr
%timeit numexpr.evaluate("1 / (1 + exp(-in_img))")
10 loops, best of 3: 27.9 ms per loop

10个循环,最佳3:每循环51.1 ms

使用numexpr:

import numpy
from numba import vectorize, float64
@vectorize([float64(float64)])
def f(x):
    return 1 / (1 + numpy.exp(-x))

使用Numba(假设您正确注释了您的功能,如下所示)

%timeit f(in_img)
100 loops, best of 3: 5.34 ms per loop

你得到:

#pythran export f(float[][])
def f(in_img):
    return 1 / (1 + numpy.exp(-in_img[:,:]))

使用pythran(假设您编译了以下函数)

pythran f.py -DUSE_BOOST_SIMD -march=native

用以下内容编译:

100 loops, best of 3: 5.07 ms per loop

并替补它:

$("#ShortText").css({
           fontSize:screen.height*.015,
            //right: screen.width * .18,
            //top: screen.height * .585,
            width:screen.width * .6,
            right: screen.width * .2,
            top:screen.height*.65
        });