2011-05-02 141 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列表上寻求帮助。