用 Python 處理泛黃的老照片

Posted by tjwei on 星期二, 3月 06, 2012 with No comments
可能是婚宴時,也可能是在 FB 上,常會到泛黃的舊照片。其實簡單的處理就能賦予舊照片新生命(可能只有一點點新生命就是了)。
最簡單的方式是用 gimp 的 auto white balance,也就是 自動白平衡處理。
但不需要用到 gimp 這麼大的程式,其實 python 和 PIL 就能處理,而且程式碼很短。
gimp 的白平衡原理,就是把 RGB 個顏色,除了上下 0.5% 外,盡量線性拉長。
下面的 PIL 可以達到相同效果(但我用了比較強的參數,上下 1.5%)


from PIL import Image, ImageOps
ImageOps.autocontrast( Image.open("a.jpg"), 3).save("f.jpg")

實際的例子:原圖
處理後



另外也可以 auto equalize,也就是把色調盡量拉成平均分佈, 整體來說色彩會比較平均,但顏色常常會變得像是有雜訊。

from PIL import Image, ImageOps
ImageOps.equalize( Image.open("a.jpg")).save("e.jpg")

 當然,也可以做其它處理,比方將 equalize 以及 autocontrast 的圖混合。或者根據 histogram 另外平移個別色彩。不過,在 PIL 中,就需要把圖的 rgb bands 拆開處理了。
下面是將 gimp 的自動白平衡改寫成 python code(其中, f 是用來找上下 0.5%),可以提供進一步修改的基礎


from PIL import Image
im=Image.open("a.jpg")
htmp=im.histogram()
hg=[htmp[i*256:(i+1)*256] for i in range(3)]
s0=im.size[0]*im.size[1]*0.005
def f(s, x=s0, i=-1):
    return i if x<0 else f(s, x-next(s), i+1)
ends=[(f(iter(h)), 255-f(reversed(h))) for h in hg]
cut=lambda c: sorted([0, c, 255])[1]
new_d=lambda d: tuple(cut(255*(c-lb)/(ub-lb)) for c,(lb,ub) in zip(d, ends))
im.putdata([new_d(d) for d in im.getdata()])
im.save("b.jpg")
Categories: