我是靠谱客的博主 神勇电脑,最近开发中收集的这篇文章主要介绍【python图像处理】彩色映射(续篇),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python中的彩色映射一文中,向大伙介绍了一下matplotlib模块中内嵌的colormap,以及如何将这些colormap中的数值导出来以供使用。

在续篇中我们将进一步向大家介绍如何生成自定义colormap。如现在有(255,0,0), (255,255,0), (255,255,255), (0,157,0), (255,0,255)五种颜色,我们如何用这些颜色作为区间边界生成一个自定义的colormap呢?

最简单的情形,以五种颜色作为边界,我们将整个灰度级平均分成4个等分,对于[0, 255]灰度区间而言,均分后的区间分别为[0, 64),[64, 128),[128, 191),[191, 255]。那么我们只需要在每个区间分别对R、G、B三个通道进行插值即可,如线性插值,具体实现如下。

def linear_colormap(colors, max):

    rows, cols = np.shape(colors)
   
    position = []  

    for i in range(0, rows):    
        position.append(np.int(round((1.0 * i * max)/(rows - 1))))

    color_map = []

    #遍历所有区间
    for i in range(0, rows - 1):
        #遍历区间中的所有像素点
        for j in range(position[i], position[i + 1]):
            color_r = (colors[i+1][0] - colors[i][0]) * (j- position[i])/(position[i + 1] - position[i]) + colors[i][0]
            color_g = (colors[i+1][1] - colors[i][1]) * (j- position[i])/(position[i + 1] - position[i]) + colors[i][1]
            color_b = (colors[i+1][2] - colors[i][2]) * (j- position[i])/(position[i + 1] - position[i]) + colors[i][2]
            
            color = (color_r, color_g, color_b)
            color_map.append(color)
    #最后一个灰度级没有遍历到,需要进行特殊处理
    color_map.append(colors[rows - 1])
    return color_map


其中,参数max是灰度级的最大值,这里即为255。顺便也贴一下绘制colormap的代码:

def draw_colormap(color_map):
    map_image_arr = np.zeros((50, 256, 3), np.uint8)

    for i in range(0, 256, 1):
        map_image_arr[:, i, 0] = color_map[i][0]
        map_image_arr[:, i, 1] = color_map[i][1]
        map_image_arr[:, i, 2] = color_map[i][2]   

    map_image = Image.fromarray(map_image_arr)
    map_image.show()
    map_image.save("colormap.png")
    return


这样,我们就得到了自定义的colormap。



另外,我们也可以通过制定区间宽度,即上述position的值来生成colormap,如position = [0, 50, 100, 150, 255]。此时只需要对上述程序略作修改即可。


def linear_colormap(colors, max, position):

    rows, cols = np.shape(colors)

    color_map = []

    #遍历所有区间
    for i in range(0, rows - 1):
        #遍历区间中的所有像素点
        for j in range(position[i], position[i + 1]):
            color_r = (colors[i+1][0] - colors[i][0]) * (j- position[i])/(position[i + 1] - position[i]) + colors[i][0]
            color_g = (colors[i+1][1] - colors[i][1]) * (j- position[i])/(position[i + 1] - position[i]) + colors[i][1]
            color_b = (colors[i+1][2] - colors[i][2]) * (j- position[i])/(position[i + 1] - position[i]) + colors[i][2]
            
            color = (color_r, color_g, color_b)
            color_map.append(color)
    #最后一个灰度级没有遍历到,需要进行特殊处理
    color_map.append(colors[rows - 1])
    return color_map


这样获得的colormap如下图所示。


更复杂一点,我们可以使用不同的插值算法,来进行自定义colormap,如使用二次、三次插值等,这里就不再作具体的介绍,感兴趣的同学可以尝试一下!


2017.03.09

最后

以上就是神勇电脑为你收集整理的【python图像处理】彩色映射(续篇)的全部内容,希望文章能够帮你解决【python图像处理】彩色映射(续篇)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部