之前在測試 RGB 轉換為灰階的七個模式,其中的第一個名為「0.21R + 0.71G + 0.07B」,我一直覺得它哪裡怪怪的。假設別的模式花不到二十分鐘打雷射的圖形,它卻要花近兩個小時,看雷射移動的軌跡,它連不需要打雷射的地方(圖片中白色的部份)也打雷射,由輸出的 GCode 可以看到它第一個開啟雷射(M106 S3.0)的位置是在左下角的原點 (G00 X0.0 Y0.0 F1200),這很明顯和我設計的圖形是不同的。
首先來看一下「0.21R + 0.71G + 0.07B」這個名稱就怪怪的,猜想它的命名是由轉換的演算法而來的。它轉換為灰階的演算法是取出一個點的RGB三色值,再分別乘上 0.21、0.71、0.07 的權重,最後再將三個數值加總成該點灰階的顏色數值(0~255),也就是當一個點是白色時 (R:255、G:255、B:255),照說轉換為灰階時應該還是白色 255。如果把加權的 0.21、0.71、0.07 三個數加起來應該要是 1 才對(255*1=255),很明顯的,前面三個數加起來是 0.99,比 1 少 0.1 呢!
好啦~那是不是把其中一個加權加上 0.1 就可以解決「白色不是白色」的問題呢?
假設我們把「0.21R + 0.71G + 0.07B」改為「0.21R + 0.71G + 0.08B」,也就是藍色由 0.07 的加權變成 0.08,白色的轉換公式為:
255*0.25+255*0.71+255*0.08
將上面的算式在 Python 中計算完是白色的 255 嗎?
哈~當然不是,Python 給的結果是:
254.99999999999997
如果照作者原來的演算法,加完要再用 int() 取整數,也就是變成:
int(255*0.25+255*0.71+255*0.08)
Python 給的計算結果為:
254
不是我們要的 255,這下又要讓雷射頭疲於奔命了。
最後來看看怎麼解決「白色不是白色」的問題,首先將轉換的權重改為「0.21R + 0.71G + 0.08B」,另外搭配使用 round() 把加完的結果取四捨五入。
所以第一種灰階轉換的這一行:
matrice[y][x] = int(pixels[pixel_position]*0.21 + pixels[(pixel_position+1)]*0.71 + pixels[(pixel_position+2)]*0.07)
改成這樣:
matrice[y][x] = int(round(pixels[pixel_position]*0.21 + pixels[(pixel_position+1)]*0.71 + pixels[(pixel_position+2)]*0.08))
下面是同一張圖,經過修正的程式,輸出了正常 GCode
由 GCode 看來,第一個打雷射的內容為:
G00 X5.125 Y10.5 F1200M106 S85.0
Y 方向是 10.5 mm 的位置,和原始設計的位置一樣了。
沒有留言:
張貼留言