【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]。此时只需要对上述程序略作修改即可。
这样获得的colormap如下图所示。
更复杂一点,我们可以使用不同的插值算法,来进行自定义colormap,如使用二次、三次插值等,这里就不再作具体的介绍,感兴趣的同学可以尝试一下!
2017.03.09
总结
以上是生活随笔为你收集整理的【python图像处理】彩色映射(续篇)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【算法+OpenCV】基于三次Bezie
- 下一篇: 【python图像处理】直线和曲线的拟合