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);


        }
    }
}