在没有PIL的情况下用Python模糊图像

时间:2013-10-28 18:29:49

标签: python blur

我正在尝试定义一个函数,它将在不使用PIL的情况下模糊python中的图像。每个像素的颜色需要与周围8个像素的颜色平均,即:

o的值需要与x的所有值平均。

x x x
x o x
x x x

我有:

def blur():
global photo
pixels = Image.getPixels(photo)
for row in range(photo.height()):
    for col in range(photo.width()):
        red = pixels[row][col][0]
        green = pixels[row][col][1]
        blue = pixels[row][col][2]
Image.setPixels(photo,pixels)

Image.getPixels()返回同一列表中0到255之间的红色,绿色和蓝色值([0]返回红色,[1]返回绿色,[2]返回蓝色)及其x和y由行和列表示的值。我已经相当广泛地搜索了一个正确方向的提示,但没有找到任何相关的东西。任何想法/帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

我认为这是作业,所以我不会写出代码。您可以使用numpy vectorize,这里是一个指针How to vectorize this python code?,将上面的三个和下面的三个相加然后硬编码将两个加到一边并除以8.然后在新的三维中重新分配红色蓝色和绿色您可以预分配为旧图像大小的数组。

答案 1 :(得分:0)

要计算8个元素的平均值,你需要得到这些元素的总和,所以从那开始。让我们来看看这些元素的索引是什么。如果中间的像素是[x] [y],则其上的像素将具有[x + 1] [y],并且其上的像素将具有[x] [y + 1]。计算出你需要的所有八个索引,并将这8个值加起来。最后将结果除以8。 同样重要的是使用两个不同的表(只是将图像复制到另一个表) - 一个是从值中获取值来计算平均值,第二个是保存新像素,否则,只使用一个表,计算下一个像素,你将使用你已经改变的像素的平均值。