使用PIL在模糊图像上的图像边缘不能正确模糊

时间:2012-11-22 16:51:55

标签: python django python-imaging-library

使用Image.filter(ImageFilter.BLUR)方​​法模糊图像时出现问题。

我的代码:

#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

如您所见,图像边缘未正确模糊。有谁知道为什么会这样?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

但是,到达图像边缘时该怎么办?似乎PIL根本就没有在那里应用滤波器,因为矩阵会与边缘重叠并给出无效结果。如果你只进行一次迭代,可能不会引人注意,但是在10次迭代中......哇!

我的建议是通过复制相邻的像素颜色,应用滤镜,然后将它们裁剪回来,将图像边缘延伸一两个像素。

或者,使缩略图大于其需要,过滤,然后裁剪。你会以这种方式丢失一些数据,但它更容易解决。