概述
在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图像处理】彩色映射(续篇)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复