【发布时间】:2015-09-25 09:27:27
【问题描述】:
我有迭代 ndimage 的函数(将图像从一种颜色空间转换为另一种颜色空间)。 运行速度太慢(2 核 CPU,2.3 GHz,图像大小 = 3 MP):
1) 蛮力方法(循环):27 秒
def imageRGBtoYCrCb(rgb_image):
""" Converts image from RGB to YCrCb. OVERWRITES.
"""
w, h = rgb_image.shape[0], rgb_image.shape[1]
for y in range(h):
for x in range(w):
rgb = rgb_image[x][y]
ycrcb = RGBtoYCrCb(rgb)
rgb_image[x][y] = ycrcb
return rgb_image
def RGBtoYCrCb(rgb):
""" Converts RGB vector to YCrCb vector
Keyword arguments:
rgb -- list of size 3: [r,g,b]
Returns: YCrCr color (list of size 3: [y,cr,cb])
"""
r,g,b = float(rgb[0]),float(rgb[1]),float(rgb[2])
y = 0.299*r + 0.587*g + 0.114*b
cb = 128 - 0.1687*r - 0.3313*g + 0.5*b
cr = 128 + 0.5*r - 0.4187*g - 0.0813*b
return [y,cr,cb]
2) 矢量化方法(numpy.apply_along_axis、numpy.dot):90 秒(???)
import numpy as np
matr_to_ycrcb_mult = np.array([ [0.299, 0.587, 0.114], [0.5, -0.4187, -0.0813], [-0.1687, -0.3313, 0.5] ])
vec_to_ycrcb_add = np.array([ 0, 128, 128 ])
matr_to_rgb_mult = np.array([ [1,1.402,0], [1,-0.71414,-0.34414], [1,0,1.772] ])
vec_to_rgb_add = np.array([ -128*1.402, 128*1.05828, -128*1.772 ])
def imageRGBtoYCrCb(rgb_image):
rgb_image = np.apply_along_axis(RGBtoYCrCb, 2, rgb_image)
return rgb_image
def RGBtoYCrCb(rgb):
""" Converts RGB vector to YCrCb vector
"""
return np.dot(matr_to_ycrcb_mult,rgb) + vec_to_ycrcb_add
有没有更快的方法来处理 ndimage?
我是否正确实现了矢量化概念?
【问题讨论】:
-
顺便说一句,我认为您的意思是“ndarray”而不是“ndimage”。
np.ndarray是基本的 numpy 数组类,而ndimage是 scipy 中的子模块。
标签: performance numpy multidimensional-array scipy vectorization