Wednesday, January 25, 2023

 ULANI 電子紙桌曆的遮騰筆記 (5)

既然dither程式完成了,那只要把色盤換成規格書中的實測值,就可以結束遮騰了?事情可沒有這麼簡單。

如果直接把L*a*b*轉成RGB後帶入,這樣子的「白色」不夠「亮」,隨之dither出來的圖案,高亮度的部份就會類似過曝的情況,暗部也無法表現出來。

於是嘗試把全部七個基本色掐一下,讓「黑色」接近全黑,「白色」接近全白,其餘的按照比例平移縮放調整一下,這樣子一來就會像是這樣,算是相當堪用了。
再來就是得想辦法塞進app中。如果直接當照片放進去的話,應該又會被再dither一次,因此要把dither好的圖,填成原先色盤的顏色值,這樣子取最接近色就會是dither好的顏色。把未dither跟dither好的圖p在一起,就可以同時比較ULANI app轉的跟改色盤後的效果。


Tuesday, January 24, 2023

 ULANI 電子紙桌曆的遮騰筆記 (4)

想要改用規格書中實測顏色來作為dither的色盤,第一步當然就是得先實作一個dither演算法。這類的演算法百百種,比較廣為人知的應該就屬 Floyd–Steinberg 了(後面簡稱FS),畢竟從開始有彩色噴墨印表機,就常常看到這個名字,只是一直沒有去看過是怎麼做的。其實FS演算法很簡單,是一種誤差擴散的方式,維基百科上就可以找到說明了,還有偽程式碼的範例。基本上,FS是先找到「色盤中最接近這個圖素的顏色」,然後計算差值分散到鄰近的像素上。

由於擴散的方向都是往前不往後,所以實際只要掃過一遍整張圖,就可以計算完成。只是要分散運算的話直接是沒辦法切開,可能還得另外處理。

有了範例程式,就先試試看灰階的圖片,看起來沒有什麼問題。於是開始改成RGB的彩色,也就是原先的PIL傳回單一數值改成[R, G, B],然後使用numpy來處理。只是算出來的都是黑畫面,不曉得問題出在哪裡。後來看了另一篇文章,才猛然想起因為python沒有明確的型別,[R, G, B]非 primitive type 會是個指標 reference,所以運算之前得使用 .copy() 複製一份數值,才不會是 [0, 0, 0] 全黑。然後FS演算法中要找「色盤中最接近這個圖素的顏色」,就用RGB三個數值的幾何距離(RGB差值的平方和再取平方根)來計算,以最笨的方式依序比較七個基本色的距離就可以得到最接近色了。先求有再求快,到這邊算是完成了第一步。



 ULANI 電子紙桌曆的遮騰筆記 (3)

這裡我們來談談色差的問題。回到之前微x電子所提供的面板規格書,裡面其實有使用儀器測定出來實際的顏色表現。所使用的單位不是平常熟知的RGB或CMYK,而是由國際照明委員會在1976年訂出的一種表示方式。其中L*代表亮度,範圍是0到100,也就是全黑到全白。而a*跟b*則是分別描述在紅綠之間跟藍黃之間的兩個座標軸,範圍是-128到127。而後面dE2000_Max這項色差數值到底是差多大,個人非相關領域還有請專業人士補充說明。

雖然維基百科上寫L*a*b*到RGB的轉換與設備相關,不過網路上可以找到轉換工具,順手就把轉換過的數值用顏色圖片的方式表示出來:

這裡很明顯就可以看到,先不考慮亮度的影響,黑色偏紫,紅色其實偏橘色,藍色偏藏青色,綠色是暗綠,反而是黃色跟橘色比較沒有偏差。跟ULANI電子曆面板實際看到的效果算是相當的吻合,合理推測應該兩者就是同一個規格的吧?(廢話,目前ACeP唯一的生產商就是台灣的元太科技e-ink)

在ULANI選擇主題的頁面中,應該已經有套用了某種轉換,所以看起來的效果與電子紙呈現的相符。假使說我們用這個實測的顏色來做dither(抖色)的話,是不是就可以減少色差呢?個人遮疼的結果的確原理就這麼簡單,但是實作上也遇到了不少的問題並不簡單。(待續)


Sunday, January 22, 2023

 ULANI 電子紙桌曆的遮騰筆記 (2)

前面提到,Gallery Palette 是使用彩色粉體來顯示,但是每個像素一次只能顯示七個基本色中的一個,沒有中間過度的灰度色階。難道說這樣就只能顯示色塊了嗎?其實也不盡然。e-ink原廠將這個面板定位在電子標籤、宣傳標示... 等等的用途,除了色差之外,使用的驅動晶片也比較平價,沒有局部更新的方式,畫面全部更新需要約30秒,不建議用在全彩顯示的應用。

當然還是有一些 work around 的方式。像以前只有單色顯示的年代,灰階是可以靠網點(dither,對岸譯作「抖色」算是蠻生動)的方式來欺騙眼睛,用犧牲空間來模擬出灰階來。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




要看出dither的最好效果,得在眼睛分不太出網點的情況,也就是說兩個像素形成的視角,得在眼睛的解析極限之下。我們可以透過 瑞利角度分辨條件 (Rayleigh's criterion) 公式來簡單的推算一下:

sin(視角) = 1.22 波長 / 圓孔,考慮到人眼瞳孔大概是 1.5mm,7.3"電子紙的解析度127dpi,兩個像素的間隔大概是0.2mm,兩個像素形成的張角~0.2mm/觀測距離L

我們可以大致算出至少要距離 L = (0.2mm)(1.5mm)/(1.22*400nm) ~ 61.5cm

不過我實際看起來,大概要70-80公分以上,才比較看不出網點。這個除了環境光線影響瞳孔大小外,要組出接近的顏色也是要兩三個像素。理論值在這邊已經是相當接近了。

很可惜ULANI桌曆所提供的不同主題,都有共同的問題就是文字很小,再經過dither處理之後近看幾乎就是單一筆劃只有一個像素寬,要再拉到一公尺遠的話,就很難看的清楚了。尤其是年曆的部份,為了要塞進十二個月並沒有太大的空間,也因此有不少網友建議,改成週曆的型式會相對比較實用。



Saturday, January 21, 2023

 ULANI 電子紙桌曆的遮騰筆記 (1)

話說在幾個月前腦波弱,看到了國內募資網站上,出現了一個使用彩色電子紙的電子桌曆。(https://www.zeczec.com/projects/ulani)當時沒有多想,自認對電子紙產品還算熟悉,應該不至於有太大雷,於是覺得價位還可以就投了$$進去。

募資結束後,募得金額是預計的8xxx%,相當驚人。不過這也是考驗的開始,隨著預定出貨日的接近,我也開始擔心發起人會不會出不了貨,甚至捲款潛逃一走了之。還好在少許延遲之後,於預定出貨日兩週內收到商品。不過這也就是一整個遮騰的開始。

首先是這個電子桌曆的設計,用的是e-ink Gallery Palette 7.3吋的面板。根據網友提供的資料,跟對岸微x電子在販售的開發板是相同的硬體。微x電子提供的資料相當齊全,還有這塊面板的硬體規格書,在ULANI規格中沒有寫清楚的都可找到需要的資料。(https://www.waveshare.com/wiki/7.3inch_e-Paper_HAT_(F))

 

 首先是顏色跟解析度,Gallery Palette是採用ACeP的技術,藉由調控色粉在微杯(micro cup,當年併購sixpix來的技術)中的位置,來讓每個像素呈現需要的顏色,這裡是固定的紅橙黃綠藍黑白七個顏色跟Kaleido使用彩色濾光片(CFA)的作法不同。後者是傳統黑白電子紙16灰階技術,蓋上RGB三個顏色來達到4096色。而Gallery的每個像素都可以顯示七個顏色中的一種,優點是白色可以很白(反射率高達~70%,會是濾色片兩倍),色彩也不需要為了提升反射率而使用降低飽和度的「淡彩」。但是因為是比較平價的控制晶片,只有全畫面刷新,還沒有灰階的能力。因此要表現出色階,就需要靠網點dither的方式,這個在硬體解析度只有 800x480 的情況下(127dpi,略遜於初代彩色噴墨印表機~150dpi),基本就是一個硬傷。另一個注意的點是,更新畫面需要30秒。雖然原本就有預期會比較慢,ULANI很隱誨的寫說要「數十秒」,但是30秒=0.5分對物理人來說,就是分鐘的尺度了。也難怪公車站牌雖然開始有使用電子紙顯示,到目前還沒有看到有用彩色的。