標籤:
<背景>
濾鏡處理是影像處理中一種非常常見的方法。比如photoshop中的濾鏡效果,除了內建的濾鏡,還擴充了很多第三方的濾鏡效果外掛程式,可以對映像做豐富多樣的變換;很多手機app實現了即時濾鏡功能,最有名的當屬Instagram。
濾鏡的原理,常見的是針對數位影像的像素矩陣,使用一個nxn的方形矩陣做濾波器(即kernel,常見的如3x3,5x5等),對該像素矩陣進行遍曆,遍曆後的映像就是輸出映像,如果演算法經過最佳化,遍曆的速度足夠快,那就是即時濾鏡(live filter),可以即時預覽映像過濾後的效果。
ImageFilter是Python PIL的濾鏡模組,目前的版本支援10種加強濾鏡,通過這些預定義的濾鏡,可以方便的對圖片進行一些過濾操作,從而去掉圖片中的噪音(部分的消除),這樣可以降低影像處理演算法的複雜度(如模式識別等),更方便的實現和預覽一些演算法的效果。
本文指令碼包含以下全部濾鏡, 實現了10種影像處理濾鏡的效果預覽和JPEG檔案儲存。
| ImageFilter.BLUR |
模糊濾鏡 |
ImageFilter.CONTOUR |
輪廓 |
ImageFilter.DETAIL |
細節濾鏡 |
| ImageFilter.EDGE_ENHANCE |
邊界加強 |
| ImageFilter.EDGE_ENHANCE_MORE |
邊界加強(閥值更 大) |
| ImageFilter.EMBOSS |
浮雕濾鏡 |
| ImageFilter.FIND_EDGES |
邊界濾鏡 |
| ImageFilter.SMOOTH |
平滑濾鏡 |
| ImageFilter.SMOOTH_MORE |
平滑濾鏡(閥值更大) |
| ImageFilter.SHARPEN |
銳利化濾鏡 |
<效果>
原圖:
模糊濾鏡:
銳度增強濾鏡:
細節濾鏡:
輪廓濾鏡:
邊界提取濾鏡:
邊界增強濾鏡:
邊界增強濾鏡-加強版:
平滑濾鏡:
平滑濾鏡-加強版:
浮雕濾鏡:
<源碼分析>
PIL庫的濾鏡演算法可以在Python\Lib\site-packages\PIL路徑下找到,如下所示:
在PIL路徑下,我們看到了三個同名但尾碼不同的檔案:ImageFilter.py ImageFilter.pyc ImageFilter.pyo 。
.pyc檔案:是同名的.py編譯後的位元組碼檔案,用來供解譯器解釋執行;
.pyo檔案:是同名的.pyc檔案經過最佳化後的位元組碼檔案,通常體積更小,運行更快。
濾鏡演算法在ImageFilter.py檔案中。
如前文所述,每一個濾鏡通常對應著一個濾波器(即kernel),PIL中的kernel均為常見的3x3和5x5方形矩陣,下面是PIL中9種濾鏡對應的矩陣:
模糊濾鏡:
class BLUR(BuiltinFilter):
name = "Blur"
filterargs = (5, 5), 16, 0, (
1, 1, 1, 1, 1,
1, 0, 0, 0, 1,
1, 0, 0, 0, 1,
1, 0, 0, 0, 1,
1, 1, 1, 1, 1
)
輪廓濾鏡:
class CONTOUR(BuiltinFilter):
name = "Contour"
filterargs = (3, 3), 1, 255, (
-1, -1, -1,
-1, 8, -1,
-1, -1, -1
)
細節濾鏡:
class DETAIL(BuiltinFilter):
name = "Detail"
filterargs = (3, 3), 6, 0, (
0, -1, 0,
-1, 10, -1,
0, -1, 0
)
邊緣增強濾鏡:
class EDGE_ENHANCE(BuiltinFilter):
name = "Edge-enhance"
filterargs = (3, 3), 2, 0, (
-1, -1, -1,
-1, 10, -1,
-1, -1, -1
)
邊緣增強濾鏡-增強版:
該增強版和原濾鏡僅僅是矩陣2行2列的一個參數大小不同,實際是修改了中心像素的權重。這個數值可以任意修改以自訂邊緣增強幅度。class EDGE_ENHANCE_MORE(BuiltinFilter):
name = "Edge-enhance More"
filterargs = (3, 3), 1, 0, (
-1, -1, -1,
-1, 9, -1,
-1, -1, -1
)
浮雕濾鏡
class EMBOSS(BuiltinFilter):
name = "Emboss"
filterargs = (3, 3), 1, 128, (
-1, 0, 0,
0, 1, 0,
0, 0, 0
)
邊緣提取濾鏡
class FIND_EDGES(BuiltinFilter):
name = "Find Edges"
filterargs = (3, 3), 1, 0, (
-1, -1, -1,
-1, 8, -1,
-1, -1, -1
)
平滑濾鏡:
class SMOOTH(BuiltinFilter):
name = "Smooth"
filterargs = (3, 3), 13, 0, (
1, 1, 1,
1, 5, 1,
1, 1, 1
)
平滑濾鏡-加強版:
平滑濾鏡的加強是增加了濾鏡視窗的尺寸,有3x3擴充到5x5, 這樣每一個新像素的產生會包含25個周圍原始像素的加權貢獻(離得越近,貢獻越大),這樣的結果會更加平滑自然,代價是處理速度會明顯的變慢。
class SMOOTH_MORE(BuiltinFilter):
name = "Smooth More"
filterargs = (5, 5), 100, 0, (
1, 1, 1, 1, 1,
1, 5, 5, 5, 1,
1, 5, 44, 5, 1,
1, 5, 5, 5, 1,
1, 1, 1, 1, 1
)
銳利化濾鏡:
class SHARPEN(BuiltinFilter):
name = "Sharpen"
filterargs = (3, 3), 16, 0, (
-2, -2, -2,
-2, 32, -2,
-2, -2, -2
)
<指令碼源碼>
#start
# -*- coding: cp936 -*-
import Image,ImageDraw
import ImageFilter,random,sys
img = Image.open("1.jpg")
##影像處理##
#轉換為RGB映像
img = img.convert("RGB")
#經過PIL內建filter處理
imgfilted_b = img.filter(ImageFilter.BLUR)
imgfilted_c = img.filter(ImageFilter.CONTOUR)
imgfilted_ee = img.filter(ImageFilter.EDGE_ENHANCE)
imgfilted_ee_m = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
imgfilted_em = img.filter(ImageFilter.EMBOSS)
imgfilted_fe = img.filter(ImageFilter.FIND_EDGES)
imgfilted_sm = img.filter(ImageFilter.SMOOTH)
imgfilted_sm_m = img.filter(ImageFilter.SMOOTH_MORE)
imgfilted_sh = img.filter(ImageFilter.SHARPEN)
imgfilted_d = img.filter(ImageFilter.Detail)
##映像儲存##
imgfilted_b.save("1b.jpg")
imgfilted_c.save("1c.jpg")
imgfilted_ee.save("1ee.jpg")
imgfilted_ee_m.save("1eem.jpg")
imgfilted_em.save("1em.jpg")
imgfilted_fe.save("1fe.jpg")
imgfilted_sm.save("1sm.jpg")
imgfilted_sm_m.save("1smm.jpg")
imgfilted_sh.save("1sh.jpg")
imgfilted_d.save("1d.jpg")
##映像顯示##
imgfilted_b.show()
imgfilted_c.show()
imgfilted_ee.show()
imgfilted_ee_m.show()
imgfilted_em.show()
imgfilted_fe.show()
imgfilted_sm.show()
imgfilted_sm_m.show()
imgfilted_sh.show()
imgfilted_d.show()
#end
純Python綜合影像處理小工具(3)10種濾鏡演算法