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
這裡就放一段實作的教學影片吧





2019年12月22日

用imagej做熱像影像的衍射映射變形合成

直接先來看結果吧!
以下這兩張圖,一個是手機相機拍攝的影像,另一張是熱像儀(Seek thermal)拍攝的影像。兩張影像來自不同相機、不同角度、不同焦距。影像大小也不一樣。




熱像影像有物體的溫度分佈,而相機影像有物體的紋理和邊緣,如果想要同時擁有兩者的優點,就像下圖的影像,該怎麼做呢?




我們使用imagej就可以做到了。

以下是影片教學。我也同時以文字紀錄在下



首先將兩張待處理的影像用imagej開啟,在imagej上用multi-point tool在定位點上做標記。我是在拍攝前就先以錢幣定位,分析時就是用錢幣位置來定位。做影像定位的時候,要注意每個點的順序是有意義的,兩張圖的定位點要能互相對應。

定位好了,就選擇Plugin/Transform/Landmark Correspondences,注意Transformation class要選擇affine。

如此就可以將圖片變形一致了,如下圖


下一步,由於希望將兩圖合成時,由手機影像提供物體的邊緣和紋理,所以選擇手機影像檢測邊緣。方法是Process/Find edge
圖片就會成為這樣



接下來關閉其他圖片,只留下變形後的熱像影像和邊緣化的手機影像,然後將兩張圖片疊成一張stack。
方法  Image/stack/Images to stack
選項就用預設值就好

接著就可以做疊合
方法是選擇這個stack之後,選擇Image/stack/Z project
Projection type選擇 Sum slices
這樣就可以做出精確疊合的影像了




2019年12月19日

用客製化調整的負片後像程式進行探究

前一篇【python製作的負片後像GIF】,我留下了一個問題:理論上紅色的補色是青色,但是在實際觀察上,看到的卻是淡淡的青色?

為什麼是這樣?我的答案是:背景顏色影響了你!

為了想讓這樣的疑惑成為一個能被探究的問題,我需要把這個負片後像中的許多變因,改變成可以調整的操縱變因,又為了考量到跨平台操作的簡便性,於是我使用HTML5的技術製作了這個程式,電腦或平板電腦上應該都能操作。

https://chihhsiangchien.github.io/afterimage/afterimage.html
你可以線上操作,或是右鍵下載回去,可以離線操作。它就一個檔案而已,沒有其他參照的檔案。其實它也在前一篇的同一個GitHub Repository裡
https://github.com/ChihHsiangChien/afterimage

你可以任意調整背景顏色,或是球的RGB顏色。執行速度也可以調整,不過目前有bug,速度調整後,會有一些球消失。
(以下只是程式截圖,不會真的動)




這個程式可以幫助你探究什麼事呢?
  • 從最簡單的觀察開始,任意一種顏色產生的負片後像顏色,和原有顏色有什麼關係?
  • 使用紅色的球,在什麼參數之下可以觀察到與理論相符的青色呢?
  • 固定球的顏色之後,改變背景顏色,負片後像會發生什麼變化?
  • 你觀察到的變化效果是「線性」的嗎?背景越淺效果就越好,或是其實有一個最佳背景值?
  • 不同顏色的球,產生的負片後像顏色所需要的最佳背景值都相同嗎?
  • 執行速度會影響觀察的效果嗎?速度和效果的關係是線性的嗎?

python製作的負片後像GIF

「負片後像」這個觀察,在實驗記錄本上通常都是紅花綠葉啦、或是藍色黃色的色塊等,讓學生盯著看之後,再說出看到了什麼顏色。但其實並不是每個學生都能看到所有顏色。

後來我用了這篇【負片後像新玩法】。用那隻會變色的龍貓,效果是好多了,大概能有七成到八成的學生說看得到負片後像。

但真的想回答到底看到了什麼顏色,其實還是有困難。像實驗記錄本那種圖案,就是有學生會說看不到啊。怎麼辦呢?後來看到有一個GIF檔的效果很好,就是很多顆洋紅色的球再那轉啊轉的,幾乎學生們都看得到那樣的顏色。

這給了我一個想法,不如就來做各種顏色的轉轉轉的GIF圖吧。用上了python 的 matplotlib 的animation,就可以做出各種顏色的圖了。

程式碼和圖片都在GitHub Repository上
https://github.com/ChihHsiangChien/afterimage

用了這些圖之後的學生達成率就變成百分百了,每個學生都能夠看到。我後來上課就把這些圖放到學生的自學網站上,就直接用這來進行實驗寫觀察記錄了。


這也稍微解決了一個錯誤「標準答案」的問題。我很討厭看到測驗題目問「盯著紅花綠葉看一陣子,產生的負片後像會變成什麼顏色」,討厭的原因是那個答案根本就不是正確答案!通常給的答案是什麼?看紅花綠葉的負片後像會變成綠花紅葉。但是啊,沒有人會真的看成綠花紅葉啊,因為這根本就是錯誤答案啊。

理論上的答案應該是紅色變成青色(cyan)、綠色變成洋紅(magenta)。但是實際上看了以下的GIF之後,你就會發現其實是淡淡的青色和淡淡的洋紅(或是說是淡粉紅)。

為什麼實際觀察經驗會跟理論有差距呢?這讓我忍不住繼續動手,不如就來做一個可以客製化調整參數的程式吧。

下篇【用客製化調整的負片後像程式進行探究】

2019年12月9日

流感疫苗小知識

有鑑於每年冬天都會被傳染流感,整個人病懨懨快死掉的,今年我總算在11月去打了自費流感疫苗。

打完之後,跟診所要了藥盒和仿單來看看,做個紀錄。









這次打的疫苗名稱叫做伏適流FLUARIX TETRA,是四價的流感疫苗,成份是「去活化裂解病毒粒子」。每劑0.5毫升的疫苗含有四種流感病毒株的血凝素hemagglutinin抗原各15微克。
這裡修正一下,之前以為仿單上的字寫錯了。不過後來有讀者好心來信,其實只是美式英語和英式英語的差異。

單張上寫的haemagglutinin和hemagglutinin只是英式英語和美式英語在併寫上的分別,美式英語中haem-這個prefix會寫成hem


一微克是百萬分之一克,原來只有少少的15微克血凝素,就可以讓身體產生免疫反應,身體實在太精巧了。

血凝素的中文全名叫做血球凝集素,常聽到的H1N1的那個H就是指血凝素。病毒要附著在細胞上,就要靠這種醣蛋白,這也是人體產生中和及保護性抗體反應的關鍵。

在這篇文章《流感病毒的感染以及疫苗設計的關鍵,都在於『醣』的多寡!》提到了一項研究。研究人員把禽流感病毒表面的血球凝集素(HA)醣蛋白上多醣分子修飾成單醣分子後,用來開發出來的疫苗,可以誘發高度的免疫效力。



要挑哪些病毒株來製備疫苗呢?這是由世界衛生組織(WHO)來發布建議的。在這個公告裡頭,就說了2019-2020北半球季節流感病毒株有哪些

  • an A/Brisbane/02/2018 (H1N1)pdm09-like virus;
  • an A/Kansas/14/2017 (H3N2)-like virus; *
  • a B/Colorado/06/2017-like virus (B/Victoria/2/87 lineage); and
  • a B/Phuket/3073/2013-like virus (B/Yamagata/16/88 lineage).
It is recommended that the influenza B virus component of trivalent vaccines for use in the 2019-2020 northern hemisphere influenza season be a B/Colorado/06/2017-like virus of the B/Victoria/2/87-lineage.

病毒株的名字怎麼這麼長?
根據衛福部的《季節性流感防治工作手冊》,在第8頁的命名學提到

流感病毒株的命名是依型別(A、B、C)而定, 1980 年世界衛生組織(WHO)
將人和動物流感病毒依據其 H 抗原亞型及 N 抗原亞型來決定流感病毒株的亞
型,並規定了流感病毒新的命名法,A 型流感病毒的命名方式為:型別⁄宿主⁄
分離地區⁄病毒株序號⁄分離年份 (HnNn),其中對於人類流感病毒,則省略宿主信
息,而分離年份以西元年呈現。以 A/swine/Iowa/15/30 (H1N1)為例,其表示的是
為 A 型流感病毒,1930 年在 Iowa 分離的以豬為宿主的 H1N1 亞型流感病毒株,
其病毒株序號為 15;其他如 A/Beijing/262/95 (H1N1),表示此病毒為人類 A 型流
感病毒在 1995 年第 262 個在北京(Beijing)分離出來,其中包含 H1(HA)和
N1(NA)抗原。
 B 型流感病毒的命名也是依型別/分離地區/病毒株序號/分離年份之方式呈
現,但不會特別提到 HA 或 NA 抗原,例如:B/Beijing/243/97;對於 C 型流感病
毒則無亞型命名方式。