2019年12月30日

用imagej做曲率分析的原理與實作

因為有朋友的研究需進行物體的曲率測量,因此周末研究了一下到底怎麼做。
(急著想知道怎麼做的,直接到頁面最底下看。前面一大段都是原理和原理實作)

要描述一個曲線有多彎,會用到一個密切圓的概念,曲線上取三個點,三點可成一個圓(三點都在圓弧上)。三點非常靠近時形成的圓,就是曲線上該點的密切圓。

當曲線越「彎」,密切圓就越小,而曲線越「直」,密切圓就越大。一個超大的圓,大到極大,圓弧看起來就變成直線。就像地球超大,你看海面就是幾乎是水平的。


以下兩張圖,分別可以看出在這個函數的曲線上,不同點的密切圓大小不同。







那麼曲率要怎麼描述呢?可以用1/r來表示,r是密切圓的半徑。下圖的黑線處就是這個sin函數在各點的曲率變化。



上述的過程,可以看這部影片的演示




其實要分析物體的曲率變化,其實就是要用函數圖形去貼合要測量的部分,然後去分析函數的曲率變化。接下來就是函數怎麼找出來。

方法是弄出一些控制點,用這些控制點擬合出一個多項式函數。下面的影片演示的是用ggb的FitPloy來擬合數個點來產生函數,然後再對函數求出一階微分和二階微分,再用那些微分方程式算出曲率。看起來好難,但其實意外的簡單。

這個連結裡有求曲率的公式,也詳細說明了公式怎麼出來的。
如何通俗地理解曲率?


我也繼續以ggb為工具,實際計算出雞蛋的表面曲率



用數個點去找出曲線,不只一種方法。可以用貝茲曲線或是B-spine(B樣條曲線)來做。
貝茲曲線在向量繪圖軟體,如inkscape會用到。我自己以前只是會用,但是實際原理不甚清楚,這次趁著機會也下手實作了解一下。

以下影片是用ggb來實作貝茲曲線


本來也想實作B-spine(B樣條曲線),但是發現有一點複雜,可能以後用python來實作看看吧。樣條曲線的原理說明,這篇應該是最清楚的
簡單粗暴 B樣條曲線入門


寫了一大堆之後,終於要進入用imagej測量曲率的部分了。
這裡需要使用的plugin叫做Kappa,已經有人寫得非常清楚了
ImageJ实用技巧——曲率计算与拟合(插件篇)
kappa 的github https://github.com/brouhardlab/Kappa/tree/master/docs
這裡就放一段實作的教學影片吧