2020年7月25日 星期六

Inkscape : Raster 2 Laser GCode generator 除蟲

2020年7月25日 星期六
如果有在玩雷雕的話,Inkscape 的 extension Raster 2 Laser GCode generator 是很好用的工具。它可以先幫我們把 Inkscape 工作區中的圖形在背景下匯出成 PNG 格式的圖檔,然後再依使用者的設定,把每一個點的顏色(RGB)轉換為灰階(每一個點均用一個 0~255 的值來表示),最後再將灰階圖中的每一個點顏色轉換成 GCode 中雷射的強度。



之前在測試 RGB 轉換為灰階的七個模式,其中的第一個名為「0.21R + 0.71G + 0.07B」,我一直覺得它哪裡怪怪的。假設別的模式花不到二十分鐘打雷射的圖形,它卻要花近兩個小時,看雷射移動的軌跡,它連不需要打雷射的地方(圖片中白色的部份)也打雷射,由輸出的 GCode 可以看到它第一個開啟雷射(M106   S3.0)的位置是在左下角的原點 (G00 X0.0 Y0.0 F1200),這很明顯和我設計的圖形是不同的。



今天謎團解開了,把「0.21R + 0.71G + 0.07B」轉完的灰階點數值顯出來,原來白色的地方應該為 255 的,通通變成 252,難怪連沒有圖案的每個點也要打雷射。

首先來看一下「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 F1200
M106   S85.0

Y 方向是 10.5 mm 的位置,和原始設計的位置一樣了。


相關文章


沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket