【发布时间】:2017-06-02 14:41:38
【问题描述】:
我已经为此搜索了任何可能的解决方案,但所有答案都不是很清楚或不完整。
所以,假设我已将图像上传到内存中:
image = Image.open('image.jpg')
如何应用此渐变(#582f91 到 #00aeef):
到这张图片:
所以变成了这样:
先谢谢了。
【问题讨论】:
标签: python numpy image-processing python-imaging-library pillow
我已经为此搜索了任何可能的解决方案,但所有答案都不是很清楚或不完整。
所以,假设我已将图像上传到内存中:
image = Image.open('image.jpg')
如何应用此渐变(#582f91 到 #00aeef):
到这张图片:
所以变成了这样:
先谢谢了。
【问题讨论】:
标签: python numpy image-processing python-imaging-library pillow
# make a cmap
mycm=matplotlib.colors.LinearSegmentedColormap.from_list('',['#582f91', '#00aeef'])
# apply on a canal
imgrad=mycm(image[:,:,0])
【讨论】:
我之前使用 cython 脚本解决了这个问题(因为需要以高帧速率更新)来实现这一点。这里函数的输入cmap 是一个扁平矩阵数组,其中每一行对应一种颜色,列对应 R G B 值。我用一个网站来生成渐变,但不记得是哪一个。图像被展平以提高速度,并在 0 到 255 int 值之间缩放。
为了能够导入和使用 cython 功能,您需要从命令行运行安装脚本,一旦您使用 pip 安装了 cython,即
pip install cython
pyhton setup.py build_ext --inplace
这应该会产生一个 c 文件和 .so 文件。
Cython 代码:
import numpy as np
cimport numpy as np
cimport cython
DTYPE1 = np.float
ctypedef np.float_t DTYPE1_t
DTYPE2 = np.int
ctypedef np.int_t DTYPE2_t
@cython.boundscheck(False)
@cython.wraparound(False)
def mat_to_im(np.ndarray[DTYPE2_t, ndim=1] data, np.ndarray[DTYPE2_t, ndim=1] cmap):
cdef int wid = data.size
cdef int x, x1, y
cdef np.ndarray[DTYPE2_t, ndim=1] im = np.zeros([wid*3], dtype=DTYPE2)
for x in range(wid):
x1 = x*3
y = data[x]*3
im[x1] = cmap[y]
im[x1+1] = cmap[y+1]
im[x1+2] = cmap[y+2]
return im
设置文件:
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy
setup(
name='image convert',
version='1',
description='color map images',
author='scooper',
install_requires=['numpy'],
ext_modules=cythonize([
Extension("image_convert", ["image_convert.pyx"], include_dirs=[numpy.get_include()])])
)
这应该有助于解决任何问题(我已经从较大的代码文件中删除了设置并且尚未对其进行测试):http://cython.readthedocs.io/en/latest/src/quickstart/build.html
【讨论】: