镜头使用Python Pillow模糊效果

时间:2016-05-13 20:20:53

标签: python algorithm pillow

在Pillow中,我们可以使用滤镜模糊图像:

  

blurred_image = original_image.filter(ImageFilter.BLUR)

但这不是真正的镜头效果。是否可以使用一些自定义过滤器?任何例子?

(2号是我需要的。第3号是枕头BLUR过滤器。)

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要为此任务的过滤添加深度。对于距离较远的距离而言,镜头模糊模糊更多。我不希望你得到每个像素的深度,而是:

  1. 为每个深层创建蒙版

    分割图像,然后手动选择每个对象的深度。例如,您应该至少识别这些图层:

    • 专注对象
    • 远背景
    • 靠近background / foreground

    然后,您还可以在未聚焦的图层之间进行插值,从而在它们之间创建平滑的渐变。只有聚焦层才能保持清晰。从所有这些创建深度图(模糊强度),其中每个像素将具有强度:

    i=|depth-focused_depth|
    

    将标准化为某些可用的间隔,以便模糊float <0.0,1.0>int <0,256>

  2. 使用蒙面模糊将此深度蒙版用作蒙版

    请参阅How to blur some portion of Image

    所以当把所有这些放在一起时我得到了这个:

    example

    模糊蒙版是手动(手)绘制的,然后将近焦点和远焦点部分(灰色,黑色)模糊在一起,留下焦点部分(白色)更改。请注意,在此蒙版中,白色表示没有模糊,因此您需要反转i

    i(x,y) = white - |depth(x,y)-focused_depth|
    
  3. <强> [注释]

    步骤#1 可以换成一些预定义的蒙版,类似于已经处理过的图像上的对象,因为许多照片都将焦点对象居中,因此深度蒙版将彼此相似对于类似形状的物体(如人)。

答案 1 :(得分:1)

要模拟镜头模糊,您必须特别注意散景效果。要创建散景效果,您必须使用二进制内核模糊方法(如光盘模糊,其中平均当前像素周围的所有像素)。此外,您还需要对图像进行伽玛校正,以便暗部变得非常暗,这样只有明亮的斑点才会产生散景。然后,您可以在没有伽马校正的情况下再次模糊图像,并获得两者的最大值。

的伪代码:
gammaCorrectedImage = image ^ 3 //无论什么力量适合你。
bokeh = discBlur(gammaCorrectedImage)
bokeh = cubeRoot(image)//恢复原始伽玛 blurImage = discBlur(图片)
finalImage = max(散景,blurImage)

我得到了足够接近的结果。 enter image description here