3

我正在使用 Numpy 和 Python2.7,并且我正在编写一个函数,该函数计算在我读入图像时每列像素出现颜色的次数(使用 PIL):

for i in range(wbmp.size[0]):
    bcount = 0
    for j in range(wbmp.size[1]):
        if wbmp.getpixel((i,j)) == 1:
            bcount = bcount + 1
    bdict[i] = bcount

字典返回为{Column#: # of times color appears},我希望能够对字典中的所有值执行标准偏差。我需要先将它们全部放入列表中吗?或者是否可以从字典中提取它?

4

2 回答 2

4

可以使用 获取字典中所有值的列表bdict.values(),因此您可以使用以下命令:

std = np.std(bdict.values())

一种更快的方法是使用更多的 numpy:

img = np.array(img)
colour_mask = img == 1  # or whichever colour you want
per_col_count = colour_mask.sum(axis=0)
std = np.std(per_col_count)

colour_mask是一个布尔掩码,沿轴 0 对其求和,将True每列的所有值相加。这势必会快很多,而且差异会随着图像的大小而增加。

于 2013-03-28T20:44:25.763 回答
2

你的字典已经有了你想要的列表,

bdict.values()

所以你可以调用std这个:

np.std(bdict.values())

但我建议立即将您的图像转换为 numpy 数组,并沿一个轴制作直方图,而不是使用您的计数版本。

from PIL import Image
i = Image.open('imfile.png')
a = np.array(i)
c = 1   # or whatever color you want
b = 256 # bit depth of image, so histogram bins are 1 color / bin

hists = np.array([ np.histogram(row, bins=b)[0] for row in a ])
s = hists[:,c].std()
于 2013-03-28T20:44:32.430 回答