我一直在写剧本,我需要它基本上:
- 使图像灰度(或双色调,我将发挥两者,看看哪一个更好的工作)。
- 处理每个单独的色谱柱,并为每个色谱柱创建净强度值。
- 将结果拆分成有序列表。
使用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)
2条答案
按热度按时间ivqmmu1c1#
我看到你正在使用numpy。我会先将灰度图像转换成numpy数组,然后使用numpy沿着轴求和。您可能会发现,当您将平滑函数修改为接受1D数组作为输入时,它的运行速度会快很多。
ldioqlga2#
在PIL文档中,
histogram
为您提供了图像中每个像素值的像素计数列表。如果您有灰度图像,则将有256个不同的可能值,范围从0到255,从image.histogram
返回的列表将有256个条目。