阿簡生物筆記

2018年8月18日

用Imagej分析薄膜干涉的顏色與厚度

最近一個眼科醫師來信問到要分析淚膜油脂層厚度的問題,真是開啟了我學習之旅,特別是在干涉色的部分。

好,一步一步來說明。在他來信之前,我從來都以為眼淚不過就是一層淚水罷了,原來眼淚不只是眼淚,請自行Google "tear film"的圖自行參考,眼淚層的最外層原來還有一層油脂層,那是眼瞼的腺體分泌的,其中一個重要功能就是讓淚水不會很快就蒸發。這層油脂層大約是100nm,不過要怎麼知道它的厚度呢?

這裡就要用到物理課教過的薄膜干涉了,現象大家也都看過,就是在柏油路上積水上剛好又有浮油就很容易看到上面有彩虹色彩的,那就是薄膜干涉。當然泡泡上的色彩也是薄膜干涉,不過這裡講的淚水上的油脂層其實是跟水上有油那個例子一樣的,如果是泡泡的話,膜兩側是空氣,所以稍稍有些不同。

那麼薄膜干涉怎麼幫助判斷厚度呢?其實薄膜干涉會出現的干涉色會和厚度有關係。下方這個圖是我看了薄膜干涉的公式之後,自己用Excel加上一些VBA畫出來的圖。越左邊的顏色是越薄的薄膜,越右邊就是越厚的了。以100nm的厚度來說,干涉色其實是灰灰白白的,所以正常人的眼睛你也不容易看到有特別的干涉色出現囉。


醫學上要檢驗這淚膜上油脂層的厚度也是有專用的機器,這次提問的醫生就告訴我他們是用Keratograph 5M這個機器在拍的。這個講機器名字也沒關係,反正誰會沒事會去買這個東西,所以沒有業配這種事情。

那機器就是有光源均勻照射眼球,然後有攝影機特寫眼球表面看薄膜干涉的干涉色,在判斷上就是主觀看顏色判斷有多厚,這次的提問就是想說可不可以量化那個顏色。提問的醫師有給一份文件【Image‑based quantitative analysis of tear flm lipid layer thickness for meibomian
gland evaluation】,有興趣的Google一下就可以看到。文件裡有一個顏色和厚度的對照圖,所以理論上只要能對到那個顏色,就知道厚度了,不過實務上是有些問題的。

一開始我以為只要像分析海溫那樣,用imagej的Calibrate的功能,把那個顏色轉換成厚度就好。不過想想是做不到的,因為真實影像的色彩是對不到那個顏色厚度圖的。舉例來說,影像中一個點的RGB(100,200,140),但是你可能在顏色厚度對照圖裡找不到這種顏色。

怎麼辦呢?所以就要找「接近」的顏色了,這裡就要用到了「歐式距離」來算了。就一個XY平面來說,空間中兩個點的距離的算法是((x1-x2)^2+(y1-y2)^2))^0.5,如果是立體空間的話,就是多加一個(z1-z2)^2而已。這邊要算「顏色接近」也是這樣做,把RGB當作三維,看看真實影像裡的某個點RGB和對照圖的RGB哪個距離比較近,找到最近的之後,換算成厚度就好了。


不過imagej裡沒有內建這種功能,所以我是把影像的色頻分離後轉存成text image再用excel去分析,那個算歐式距離的就交給Excel VBA去算,程式在此
https://drive.google.com/file/d/1sZ-Rc9G42_ITNTRvS-GKfZS03X2eNPCs/view?usp=sharing


好啦,大致上就是這樣,詳細的分析方法就用影片吧。


 

2018年7月25日

用科學Maker社團工具,解剖觀察果蠅卵巢睪丸與精子

在「科學Maker」社團裡,江老師前些時候推出了新設計的「超級物鏡」(大約等於20x物鏡),然後也鼓勵大家用超級物鏡觀察精子
那時候我就想唉呦,觀察也不一定要人類的對吧,其實也可以看其他生物的啊。第一個我想到的是蕨類的,可是看看住家附近的,結果沒找到原葉體。後來看到回應裡Eredh Ereb 說據說果蠅的精子尾巴超長長長。

有些果蠅(Drosophila)的精子尾巴非常長,有種學名叫作 Drosophila bifurca 的二裂果蠅,擁有記錄上最長的精子,尺寸大到要以公分計算,一隻精子從頭到尾可以長達「5.8 公分」


喔喔,一隻果蠅還不到一公分,牠精子就5.8公分,這也太厲害了吧,真是想親眼看看啊。不過我得先一件一件事解決。
  1. 我可能找不到二裂果蠅,住家附近能找到的大概是黑腹果蠅(Drosophila melanogaster),我猜精子大概也很長。
  2. 我沒解剖過果蠅,不知道哪裡下刀。而且它睪丸長怎樣啊?
  3. 我得抓到果蠅啊
第二件事好解決一些,就上youtube找「fruit fly dissection」,可以看到解剖腦部卵巢睪丸的影片。那長怎樣呢?就查圖片 fruit fly ovary或是fruit fly testis,看一看大概就有個底了。

那果蠅哪裡來呢?當然就自己抓啊。得先準備好陷阱。其實我一開始笨笨的,想說弄個塑膠袋裝果皮果肉,然後等果蠅來,我再用蟲網撈起來。這樣的確有果蠅來,但是用蟲網卻抓不到啦,果蠅可是比蟲網的洞還小啊。

準備寶特瓶(我覺得四方型的茶飲罐不錯),把頭切開反插回去



斜立在牆邊,不是這樣就好喔,要記得放一些果皮果肉進去啊。



這四罐左至右分別是鳳梨果皮、臍橙和奇異果皮、香蕉果皮帶一小塊果肉、又是鳳梨果皮。這裡順便做個實驗,看看哪一種最容易吸引果蠅,結果啊,是香蕉呢。看到留在罐子裡的大部分都是母果蠅(還好還有一些公果蠅可以做實驗),它們千里迢迢來這邊,其實也順便找到產卵的地方,香蕉對牠們應該是很不錯的培養基吧。


接下來拿個大塑膠袋,把罐子放進去。在袋子裡把罐子打開,讓果蠅飛進袋子,我再把罐子拿到袋子外。裝了果蠅的塑膠袋,再綁起來放在冰箱冷凍庫幾十秒麻醉果蠅就可以進行實驗了。




整個解剖與觀察的過程,我剪輯在這部影片裡




這個觀察活動,我打算全程都使用「科學Maker」的工具來操作。首先上場的是微距鏡。加在手機鏡頭上的微距鏡,搭配科學積木組成的觀察架,可以把手機當作解剖顯微鏡來用啊,而且還可以全程錄影紀錄呢。工作距離足以讓我在鏡頭下操作鑷子,只是要練習一件事,就是這樣觀察是沒有立體感的,所以鑷子移動時可能會弄錯高度,夾不到東西。




這是母果蠅

解剖之後


卵巢的顯微圖,規律的美感還蠻特別的。我查果蠅卵巢的圖時,看到很多人都會用果蠅卵巢來做美美的科學攝影,看一下這搜尋結果


接下來就是雄果蠅了,腹部尺寸和顏色和雌果蠅不同,在挑的時候,肉眼就可以分辨出來了。而在顯微鏡下還可以用性梳來分辨(長在第一對前足的跗節上)


挑出來的卵巢


我不知道有什麼比較好的方法可以把精子從睪丸裡弄出來,所以我是用鑷子挑破或是用蓋玻片壓破。在youtube上看到有人拍攝的精子都會動得很厲害,不過我看到的都安安靜靜的,不知道哪個環節有問題啊。

畫面中央的一團捲捲的就是精子,可以看到頭部


這在超級物鏡下觀察的一團捲在一起的精子(尾巴這麼長,如何游泳不互卡?)


這是睪丸的一部分,可以看到睪丸裡頭的精子尾巴喔


總結一下,科學Maker的工具真是不錯,即使沒有實驗室用的解剖顯微鏡、複式顯微鏡也可以進行許多科學實驗,即便是這種小小昆蟲的解剖觀察精子也行。

有興趣的就臉書找社團加入,每隔一段時間就有工具贊助的活動。

2018年7月24日

Imagej配合Weka機器學習plugin做segmentation 偵測葉片氣孔位置 並裁切出單圖

這標題說得好複雜,希望一張圖就看懂在幹嘛。中間的圖是一張葉片下表皮經過表面精密翻模翻出來的照片(詳見樟樹葉的表面翻模與著色),旁邊的小圖是把個別氣孔裁切出來存出的小圖。即使照片裡有幾百幾千個氣孔,做好這件事也不用一分鐘,這就是這篇要做的事情。






所需要的工具就是fiji這個特別的imagej。
下載位置:https://fiji.sc/

它預載了Trainable Weka Segmentation這個plugin,我就是用這個plugin來偵測出氣孔位置。然後再用imagej的巨集(Macro),把偵測出的氣孔存成單張圖片。

整個流程我會用四部影片來說明:

機器學習的過程一看名字就覺得好複雜,但是透過這個plugin其實很簡單。就是你先教機器那個是保衛細胞,哪些是表皮細胞,然後訓練機器找出規則,讓它自己找出其他的保衛細胞,訓練好的分類器(Classifier),可以用在同類型的其他圖片上找氣孔。

第一部影片是針對單張圖片做分類器的訓練,第二部則是用多張圖片做成Stack,套用已經訓練的分類器直接找出氣孔。



第三部影片是利用分類器分類出來的圖片轉成ROI Manager的選取區,就可以在原圖上找到氣孔位置。這部影片會輪流示範單張圖片和多張圖片疊成的Stack要怎麼做這件事。

第四部影片是利用巨集來把單個氣孔裁切成單張圖,Macro是用來簡化重複工作的,首先利用record macro的方式找出每個滑鼠點擊的指令的文字命令是什麼,影片裡會教怎麼找,然後利用迴圈重複執行就可以。

影片中使用的Macro是這個,使用者要根據自己的狀況改一下檔名和存檔位置
for (i=0; i<roiManager("count"); ++i) {
    roiManager("Select", i);
    run("Duplicate...", "title=crop");
    run("Make Inverse");
    setForegroundColor(0, 0, 0);
    run("Fill", "slice");
    saveAs("Tiff", "rticle_"+(i+1)+".tif");
    close();
    //Next round!
    selectWindow("cell.jpg");
}





如果你有幾十張顯微照片,每張照片都有上千個氣孔,善用以上的流程,其實幾分鐘就可以做完這件事情了

2018年7月18日

用imagej加上Macro巨集畫輔助線測量蛋徑

這個文章要從這篇《用openscad畫個蛋》說起。

因為要用OpenScad畫出蛋,那麼勢必需要測量一顆蛋在不同高度的徑長。一種方式大概就是直接在蛋上劃線,再用游標尺夾蛋測量。不過如果要畫的蛋只有照片的話,那麼怎樣做比較方便呢?

我提議就用imagej來畫輔助線測量吧,但是需要用到Macro來劃線。我在Imagej的Macro資料庫裡找到Grid_Overlay這個Macro,看一看我只要修改一些就可以符合需求。

如果是直接從Blog的文章複製代碼過去的話,作法是在Imagej的功能表選擇Plugins/Macro/Record...,把代碼貼到視窗後,再按下Create。接著在新出現的視窗上找到Run按下去就可以執行了。

執行後的畫面,可以在畫面中劃上規律格線,有了參考格線就比較方便劃線測量了。




   requires("1.43j");
   color = "red";
   nLines = 6;
   if (nImages==0) run("Boats (356K)");
   run("Remove Overlay");
   width = getWidth;
   height = getHeight;
   tileHeight = height/(nLines+1);
   tileWidth = tileHeight;
   xoff=tileWidth;
   while (true && xoff<width) { // draw vertical lines
      makeLine(xoff, 0, xoff, height);
      run("Add Selection...", "stroke="+color);
      xoff += tileWidth;
   }
   yoff=tileHeight;
   while (true && yoff<height) { // draw horizonal lines
      makeLine(0, yoff, width, yoff);
      run("Add Selection...", "stroke="+color);
      yoff += tileHeight;
   }
   run("Select None");

用openscad畫個蛋



同事之前帶個專題研究,要用3D印表機印出蛋模型來做一些研究。不過要怎麼做個蛋模型呢?於是我出了主意,不如用OpenScad來畫蛋吧。只要修改一些參數,就可以做出不同的蛋模型。

以下這個程式碼,基本上只要修改r0到r10的參數就可以了。
整個程式的意義是畫出11個圓形,每個圓形間隔100(由參數space設定),每個圓形的半徑就分別是r0到r10。11個圓形疊在一起後,再用hull把那些圓形包起來,就會像一個卵形。下圖的粉紅色區塊就是還沒有被hull包起來的樣子。接下來再用一些程式把2D平面的卵形變成立體的卵。







r0 = 0;
r1 = 413/2;
r2 = 534/2;
r3 = 567/2;
r4 = 557/2;
r5 = 498/2;
r6 = 372/2;
r7 = 0;
r8 = 0;
r9 = 0;
r10 = 0;

space =100;
trans = max (r0,r1, r2,r3,r4,r5,r6,r7,r8,r9,r10);
bigSqure = 4000;
rotate_extrude(covexity= 10){
    intersection(){
    square(bigSqure);
    rotate([0,0,90])
    translate([trans,0,0])
        hull(){
        translate ([space*0,0,0])  circle(r0,center = true,$fn = 100);
        translate ([space*1,0,0])  circle(r1,center = true,$fn = 100);
        translate ([space*2,0,0])  circle(r2,center = true,$fn = 100);
        translate ([space*3,0,0])  circle(r3,center = true,$fn = 100);
        translate ([space*4,0,0])  circle(r4,center = true,$fn = 100);
        translate ([space*5,0,0])  circle(r5,center = true,$fn = 100);
        translate ([space*6,0,0])  circle(r6,center = true,$fn = 100);
        translate ([space*7,0,0])  circle(r7,center = true,$fn = 100);
        translate ([space*8,0,0])  circle(r8,center = true,$fn = 100);
        translate ([space*9,0,0])  circle(r9,center = true,$fn = 100);
        translate ([space*10,0,0])  circle(r10,center = true,$fn = 100);


        }
    }
}
    

你可能對這有興趣

Related Posts Plugin for WordPress, Blogger...