使用numpy对3D数组应用褐黄效果
在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()