2017年12月10日 星期日

Python 序顫法(Ordered dither technique)顯示灰階影像


Ordered Dither Technique 是一個古老的方法,用黑白兩色來顯示多階的灰度影像,由於這個方法非常簡單,至今仍廣泛使用。不僅在顯示顯像,壓縮、資料安全等議題都有它的影子。


dither table 是一個小矩陣,通常是4X4或8X8,裡面儲存的是臨界值(threshold value)。序顫法就是將灰階影像的值與臨界值作比較,若灰階影像的值大於等於臨界值,則輸出白點,否則輸出黑點。通常灰階影像的尺寸遠大於dither table ,所以將灰階影像切割成與dither table一樣的小影像,每個小影像使用同一個dither table作比較。

Python的特色是矩陣運算,所以儘量使用區塊運算,而不是逐一運算每個像素點。簡而言之,儘量不要用for loop就對了。

↓程式如下

第3行:dtable 是一個8X8的dither table
第15行:rx及offx分別是width/8 的商及餘數
第16行:ry及offy分別是height/8 的商及餘數
第17-18行:bigdata 是 data右邊及下方外加灰度值為0的像素,使得bigdata的長及寬皆是8的倍數
第19行:將dither table 重複拼貼,使得 bigdtable與bigdata有相同尺寸
第20行:將bigdata與bigdtable 的比較結果放入A中
第21行:依原始尺寸取出A
第22行:由於outdata 是8 bits/pixel (雖然其值為True及False),將結果轉成255及0
第23行:將8bpp轉換成1bpp(bits per pixel)

↓將256-level 轉換成2-level


從程式中可以看出,大部份的程式碼在處理輸入影像的長寬是否為dither table 的倍數,真正的序顫法只有一行,就是第20行。

-- end --

沒有留言:

張貼留言