【问题标题】:How to apply gradient map on a grey scale image如何在灰度图像上应用渐变图
【发布时间】:2017-06-02 14:41:38
【问题描述】:

我已经为此搜索了任何可能的解决方案,但所有答案都不是很清楚或不完整。

所以,假设我已将图像上传到内存中:

image = Image.open('image.jpg')

如何应用此渐变(#582f91 到 #00aeef):

到这张图片:

所以变成了这样:

先谢谢了。

【问题讨论】:

    标签: python numpy image-processing python-imaging-library pillow


    【解决方案1】:

    只需使用LinearSegmentedColormap

    # make a cmap
    mycm=matplotlib.colors.LinearSegmentedColormap.from_list('',['#582f91', '#00aeef'])
    
    # apply on a canal
    imgrad=mycm(image[:,:,0])
    

    【讨论】:

      【解决方案2】:

      我之前使用 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

      【讨论】:

      • 所以基本上必须使用映射单独重新分配像素值。然后将返回的图像重新调整为原始图像尺寸。
      • 嗯,好的。我以前从未使用过 Cython。你能给我一个快速指南,我如何使用你的功能?
      • 如果您仍在寻找解决方案或比 matplotlib 更快的解决方案,抱歉回复缓慢?我已编辑答案以包含安装脚本?
      猜你喜欢
      • 2016-04-22
      • 2014-02-15
      • 1970-01-01
      • 2020-05-14
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多