2011-05-02 148 views
1

我是python和matplotlib的新手,我想知道是否有人知道是否有任何實用工具可用於執行均值直方圖均衡化,但執行matplotlib顏色表?有一個叫做matplotlib.colors.Normalize的函數,如果給定一個圖像數組,它會自動設置底部和頂部的水平,但我想要更聰明的東西。我總是可以將直方圖均衡應用於數據本身,但我寧願不觸摸數據。有什麼想法嗎?matplotlib顏色表的直方圖均衡

回答

3

你必須創建自己的特定圖像的顏色表,但它不是太靠譜:

import pylab 
import matplotlib.colors 
import numpy 

im = pylab.imread('lena.png').sum(axis=2) # make grayscale 
pylab.imshow(im, cmap=pylab.cm.gray) 
pylab.title('orig') 
imvals = numpy.sort(im.flatten()) 
lo = imvals[0] 
hi = imvals[-1] 
steps = (imvals[::len(imvals)/256] - lo)/(hi - lo) 
num_steps = float(len(steps)) 
interps = [(s, idx/num_steps, idx/num_steps) for idx, s in enumerate(steps)] 
interps.append((1, 1, 1)) 
cdict = {'red' : interps, 
     'green' : interps, 
     'blue' : interps} 
histeq_cmap = matplotlib.colors.LinearSegmentedColormap('HistEq', cdict) 
pylab.figure() 
pylab.imshow(im, cmap=histeq_cmap) 
pylab.title('histeq') 
pylab.show() 
+0

哇!謝謝你,這個代碼片段。這是非常豐富的。我會繼續嘗試這個。我認爲這將是matplotlib.colors.Normalize中包含的一個很好的功能。也許,我會在他們的論壇中停下來,看看有沒有人想過在未來的版本中加入這個。乾杯。 – ehsteve 2011-05-02 20:34:17

+1

使用np.lexsort()可能會有一種更簡單的方法,只是將輸入包裝爲imshow,而不是爲每個圖像創建新的顏色映射。這可能是他們爲什麼避免將其作爲Normalize的一部分實施的原因。 – 2011-05-03 04:40:04

+0

我不知道np.lexsort()。謝謝你。 – ehsteve 2011-05-06 21:50:12

0

直方圖均衡可以通過修改圖像的調色板(或LUT)來應用,所以它會定義一個均衡的調色板。

我搜索了一下,找不到用於計算均衡調色板的源代碼,所以除非出現問題,否則您必須親自編寫代碼。

您應該從Wikipedia article的算法說明開始。

你也可以在matplotlib列表上尋求幫助。