我正在尝试计算 RGB 图像的平均亮度。为此,我找到每个像素的亮度,即
L(r,g,b) = X*r + Y*g + Z*b (some linear combination).
然后通过将所有像素的亮度相加并除以宽度*高度来找到平均值。为了加快速度,我正在使用 pyopencl.reduction.ReductionKernel
我传递给它的数组是一个单维 Numpy 数组,因此它的工作方式与给出的示例一样。
import Image
import numpy as np
im = Image.open('image_00000001.bmp')
data = np.asarray(im).reshape(-1) # so data is a single dimension list
# data.dtype is uint8, data.shape is (w*h*3, )
我想将示例中的以下代码合并到其中。即我将对数据类型和我传递的数组类型进行更改。这是一个例子:
a = pyopencl.array.arange(queue, 400, dtype=numpy.float32)
b = pyopencl.array.arange(queue, 400, dtype=numpy.float32)
krnl = ReductionKernel(ctx, numpy.float32, neutral="0",
reduce_expr="a+b", map_expr="x[i]*y[i]",
arguments="__global float *x, __global float *y")
my_dot_prod = krnl(a, b).get()
除此之外,我的 map_expr 将对每个像素起作用并将每个像素转换为其亮度值。而 reduce expr 保持不变。
问题是,它适用于数组中的每个元素,我需要它适用于每次 3 个连续元素(RGB)的每个像素。
一种解决方案是使用三个不同的数组,一个用于 R,一个用于 G,一个用于 B,这可行,但是还有其他方法吗?