使用numpy对3D数组应用褐黄效果

2 投票
2 回答
2293 浏览
提问于 2025-04-18 07:17

在numpy中,我想处理一个三维数组,这个数组包含颜色值(二维表示一张图片,每个像素是一个RGB颜色)。我想给它加一个怀旧的棕褐色滤镜。假设颜色是由r, g, b来定义的,应用棕褐色滤镜后应该返回的颜色是:

sepia_r = .393*r + .769*g + .189&b
sepia_g = .349*r + .686*g + .168*b
sepia_b = .272*r + .534*g + .131*b

那么,在处理一个大的数组(假设是1080x864的数组,每个像素有三个数值)时,最快的实时处理方法是什么呢?

2 个回答

1

根据我对numpy速度的经验,最好找一个全局的指令来完成整个任务。比如,我应该把r值放在一个数组里,把g值放在另一个数组里,把b值放在最后一个数组里,然后使用乘法操作:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html

5

假设我们有一个标准的图像数组结构,格式是 (高度, 宽度, 通道数),那么你可以直接使用 numpy 的矩阵乘法功能,不需要额外的处理。

from skimage.data import lena  # Color image version of lena. If you don't have skimage, use any image
import matplotlib.pyplot as plt

img = lena().astype(float) / 256.
plt.figure()
plt.subplot(1, 2, 1)
plt.imshow(img)

sepia_filter = np.array([[.393, .769, .189],
                         [.349, .686, .168],
                         [.272, .534, .131]])

# here goes the filtering
sepia_img = img.dot(sepia_filter.T)

# Unfortunately your filter lines do not have unit sum, so we need to rescale
sepia_img /= sepia_img.max()

plt.subplot(1, 2, 2)
plt.imshow(sepia_img)
plt.show()

撰写回答