2012-11-22 119 views
0

我在使用Image.filter(ImageFilter.BLUR)方​​法模糊图像时遇到问题。使用PIL的模糊图像上的图像边缘不会模糊不清

我的代码:

#Open the image from the ImageField 
fp_big = open(self.image_big.path, 'rb') 
im_big = Image.open(StringIO(fp_big.read())) 

#Resize the image 
im_big.thumbnail(size_big, Image.ANTIALIAS) 

#Blur the image 
im_big = im_big.convert('RGB') 
for i in range(10): 
    im_big = im_big.filter(ImageFilter.BLUR) 

#Save the images 
temp_handle_big = StringIO() 
im_big.save(temp_handle_big, PIL_TYPE) 
temp_handle_big.seek(0) 

#Save image to a SimpleUploadedFile which can be saved into ImageField 
suf_big = SimpleUploadedFile('%s' % os.path.split(self.image_big.name)[-1], temp_handle_big.read(), content_type=IMG_TYPE) 

#Delete old images and close fps 
fp_big.close() 
os.remove(original_path_big) 

虽然这个代码工作正常,结果是部分错:

Resized image Blurred image

正如你所看到的,图像的边缘不正确模糊。有谁知道为什么发生这种情况?

Thx提前。

+0

我不太了解PIL,但这可能与图像模糊有关。我模糊图像的方式是将它分解为一个像素矩阵,并根据它周围的像素或其周围像素的某个深度修改每个像素的值。因此,bluring可能仅出现在图像像素明暗处的设定深度,或者由于不能应用卷积,因此图像的部分不会变得模糊。或者我只是在说胡话。我不知道。我不是医生。 –

回答

0

这似乎是过滤库中的一个错误。许多滤镜使用NxN矩阵,它基本上是“任何像素都是其自身与周围像素的各种组合的组合”

但是,到达图像边缘时该怎么办?看起来,PIL只是不在那里应用滤波器,因为矩阵会重叠边缘,并给你无效的结果。如果你只做了一次迭代,可能不会引起注意,但在10次迭代中......哇!

我的建议是通过复制相邻的像素颜色,应用过滤器,然后将其裁剪出来,将该边上的图像边缘延长一个像素或两个像素。

或者,使缩略图比需要的大,过滤,然后裁剪。你会以这种方式丢失一些数据,但它是一个更简单的解决方案。

+0

谢谢!我有一个原始图像(不调整大小)。所以我要做的就是你所说的。模糊原始图像的副本,然后裁剪并调整大小。完成后我会发布代码! (现在还不能投票) – pensacola

+0

不是我所建议的,但是这会起作用,因为缩略图模糊会隐藏模糊不足。 –