【python图像处理】彩色映射(续篇)
在Python中的彩色映射一文中,向大伙介紹了一下matplotlib模塊中內(nèi)嵌的colormap,以及如何將這些colormap中的數(shù)值導(dǎo)出來以供使用。
在續(xù)篇中我們將進(jìn)一步向大家介紹如何生成自定義colormap。如現(xiàn)在有(255,0,0), (255,255,0), (255,255,255), (0,157,0), (255,0,255)五種顏色,我們?nèi)绾斡眠@些顏色作為區(qū)間邊界生成一個(gè)自定義的colormap呢?
最簡(jiǎn)單的情形,以五種顏色作為邊界,我們將整個(gè)灰度級(jí)平均分成4個(gè)等分,對(duì)于[0, 255]灰度區(qū)間而言,均分后的區(qū)間分別為[0, 64),[64, 128),[128, 191),[191, 255]。那么我們只需要在每個(gè)區(qū)間分別對(duì)R、G、B三個(gè)通道進(jìn)行插值即可,如線性插值,具體實(shí)現(xiàn)如下。
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 = []#遍歷所有區(qū)間for i in range(0, rows - 1):#遍歷區(qū)間中的所有像素點(diǎn)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)#最后一個(gè)灰度級(jí)沒有遍歷到,需要進(jìn)行特殊處理color_map.append(colors[rows - 1])return color_map其中,參數(shù)max是灰度級(jí)的最大值,這里即為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。
另外,我們也可以通過制定區(qū)間寬度,即上述position的值來生成colormap,如position = [0, 50, 100, 150, 255]。此時(shí)只需要對(duì)上述程序略作修改即可。
這樣獲得的colormap如下圖所示。
更復(fù)雜一點(diǎn),我們可以使用不同的插值算法,來進(jìn)行自定義colormap,如使用二次、三次插值等,這里就不再作具體的介紹,感興趣的同學(xué)可以嘗試一下!
2017.03.09
總結(jié)
以上是生活随笔為你收集整理的【python图像处理】彩色映射(续篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法+OpenCV】基于三次Bezie
- 下一篇: 【OpenCV3】cv::Mat中最值和