上個月的時候,看到一則新聞《這些花磚圖案超美 竟全靠飛蛾貢獻》-暨南大學陳彥錚教授將蛾類圖片利用程式製作成花磚。我看到的時候,覺得這好有創意,很想也跟著做看看。本來想用python來寫,不過想到還有GUI要處理,乾脆試著用Imagej加上Macro來處理看看好了。
程式放在GitHub
主要就是兩個程式
- makePolygon.ijm
- afterPolygon.ijm
以下處理的範例-銀目天蠶蛾的圖片來自飛蛾資訊分享站(http://twmoth.tesri.gov.tw/peo/FBMothInfo/23805)
先來分析看看怎麼處理,這是最後的成果,捨去背景不看,其實內部就是同一張圖片旋轉不同角度拼接起來的。方塊的方向不同(蛾頭方向朝內或朝外),做出來的效果也不同
再看原圖一下,也就是說要在原圖的適當位置上找出一個合適角度的正方形
但是要用imagej畫這種正方形很難。第一、它的邊長不是平行x軸和y軸,第二、角度又要符合自己需求,第三、大小又要可調整。
後來我想到一個方法,既然不能直接畫出正方形,那我就指定兩點,再用這兩點來畫出正方形吧。哪兩點呢?就用直線工具畫出中心點到正方形的其中一個頂點,剩下再用程式去找出來另外三個頂點。
後來我想到一個方法,既然不能直接畫出正方形,那我就指定兩點,再用這兩點來畫出正方形吧。哪兩點呢?就用直線工具畫出中心點到正方形的其中一個頂點,剩下再用程式去找出來另外三個頂點。
其實原理在高中數學就有,把頂點一的座標減去中心點的座標,就可以得到一個中心點到頂點的向量,接下來再用旋轉矩陣的公式,找到旋轉90、180、270度之後的新向量,再把這些向量加回原來的中心點座標,那就可以得到另外三個頂點的座標了。
這就旋轉矩陣
但是找出四個座標之後,還不能直接畫出方形,因為四個點的座標可能會超出畫面,所以必須調整畫布大小。所以下一步就是分別計算四個點的x和y是不是有超過圖片的寬和高,如果有,就調整畫布大小。最後才可以把選取區畫出來了。
以上這些步驟就是在makePolygon.ijm這個程式所執行的
第二個程式makePolygon.ijm就只是把找到的正方形貼到一張新的大圖上,拼出一個花磚
看起來很簡單,但在imagej上要實現,花了一些功夫(我想應該有更快的作法,但是目前還不會就是了)
以下第一部影片介紹怎麼操作
第二部影片就是說明程式製作的原理是什麼,但是第二支程式的細節太多,多到我忘了,反正就是不斷的位移和旋轉....