2013-10-28 60 views
0

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

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值。我已经相当广泛地搜寻了正确方向的提示,但没有找到任何相关的内容。任何想法/帮助将不胜感激。谢谢!

+0

听起来像你已经有了做什么的想法。平均每个像素与八个周围的邻居。有什么问题? – Kevin

+0

我会说你需要创建一个图像的硬拷贝,这样你就可以用原始值(避开的技巧,例如,使用已经改变的值来进一步改变其他值)来操作副本。那么我建议你考虑使用切片的平均值。所有这些都要小心图像的边界(如果row = 1,我们不想使用像素[row-3],你不同意吗?希望它们有足够的提示朝正确的方向发展。 – Jblasco

+0

我想我的问题是我根本不了解如何获得8个周围像素的值,我知道如何平均他们,一旦我获得这些值,但这就是我卡住的地方 – user2884456

回答

1

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

0

Ofc来计算8个元素的平均值,您需要有这些元素的总和,所以从这里开始。让我们来思考这些元素会有什么索引。如果中间的像素是[x] [y],那么比右边的像素会有[x + 1] [y],并且其上的像素会有[x] [y + 1]。找出你需要的所有八个索引,并总结这8个值。最后将结果除以8. 同样重要的是使用两个不同的表格(只需将图像副本复制到另一个表格中) - 您从中计算平均值的值,然后在其中保存新像素,因为否则,只使用一个表格来计算下一个像素,您将使用已经更改的像素的平均值。

相关问题