PIL:创建图像色彩亮度的一维直方图?
image-processing
python
python-imaging-library
5
0

我一直在编写脚本,基本上需要它:

  • 将图像设为灰度(或双色调,我将同时使用两者,看看哪个效果更好)。
  • 处理每个单独的列并为每个列创建一个净强度值。
  • 将结果吐入有序列表。

使用ImageMagick确实有一种简单的方法(尽管您需要一些Linux实用程序来处理输出文本),但是我并没有真正看到如何使用Python和PIL做到这一点。

这是我到目前为止的内容:

from PIL import Image

image_file = 'test.tiff'

image = Image.open(image_file).convert('L')

histo = image.histogram()
histo_string = ''

for i in histo:
  histo_string += str(i) + "\n"

print(histo_string)

这样会输出一些内容(我正在寻找结果的图形),但看起来却与ImageMagick的输出完全不同。我正在使用它来检测扫描书的接缝和内容。

感谢任何帮助!


我现在有一个(讨厌的)解决方案可以工作:

from PIL import Image
import numpy

def smoothListGaussian(list,degree=5):
  window=degree*2-1
  weight=numpy.array([1.0]*window)
  weightGauss=[]

  for i in range(window):
    i=i-degree+1
    frac=i/float(window)
    gauss=1/(numpy.exp((4*(frac))**2))
    weightGauss.append(gauss)

  weight=numpy.array(weightGauss)*weight
  smoothed=[0.0]*(len(list)-window)

  for i in range(len(smoothed)):
    smoothed[i]=sum(numpy.array(list[i:i+window])*weight)/sum(weight)

  return smoothed

image_file = 'verypurple.jpg'
out_file = 'out.tiff'

image = Image.open(image_file).convert('1')
image2 = image.load()
image.save(out_file)

intensities = []

for x in xrange(image.size[0]):
  intensities.append([])

  for y in xrange(image.size[1]):
    intensities[x].append(image2[x, y] )

plot = []

for x in xrange(image.size[0]):
  plot.append(0)

  for y in xrange(image.size[1]):
    plot[x] += intensities[x][y]

plot = smoothListGaussian(plot, 10)

plot_str = ''

for x in range(len(plot)):
  plot_str += str(plot[x]) + "\n"

print(plot_str)
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我看到您正在使用numpy。我先将灰度图像转换为numpy数组,然后使用numpy沿轴求和。奖励:当您修复它以接受一维数组作为输入时,您可能会发现平滑函数的运行速度要快得多。

>>> from PIL import Image
>>> import numpy as np
>>> i = Image.open(r'C:\Pictures\pics\test.png')
>>> a = np.array(i.convert('L'))
>>> a.shape
(2000, 2000)
>>> b = a.sum(0) # or 1 depending on the axis you want to sum across
>>> b.shape
(2000,)
收藏
评论

PIL的文档中histogram为您提供了图像中每个像素值的像素计数列表。如果您有灰度图像,将有256个可能的值,范围从0到255,并且image.histogram返回的列表将有256个条目。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号