在使用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中它很慢。
答案 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
});