2019年10月9日

生物的自體螢光

在利用科學Maker的螢光顯微鏡觀察植物組織的螢光後,來整理一下可以看看哪些物體的螢光。

Autofluorescence自體螢光,最顯著的例子就是葉綠色的紅色螢光,在維基的頁面上列出了當它受到465nm與665nm的激發光源照射後,可以產生673nm與 726nm的螢光。簡單的說就是你用藍光或紫光照射葉綠素,就能看到它發出紅色螢光。要操作的話,就用驗鈔燈照葉綠素的溶液就看得到了。

那麼還有什麼東西可以像葉綠素一樣也發螢光呢?原來非常多啊
NAD(P)H (max. 460 nm)
核黃素 flavins (max. 520 nm)
蝶呤 pterins (max. 450 nm)
甲殼素 chitin (max. 450–460 and 520 nm)
膠原蛋白和彈性蛋白 collagen and elastin (max. 400–430, 465, 495 and 520 nm)
纖維素 cellulose (max. 420–430 nm)

那麼這些利用自體螢光可以做哪些研究呢?我在這篇Review Article
Vital Autofluorescence: Application to the Study of Plant Living Cells 看到了許多應用。

  1. 花粉粒的識別:不同種類的花粉粒分泌物不同,成分不同,螢光也就不同。風媒傳粉的花粉粒(樺樹、松樹等)主要是藍色螢光,而昆蟲傳粉的花粉粒則屬於不同的種類——藍色、黃色、綠色或藍綠色。未成熟的花粉因為有葉綠素所以會呈現紅色螢光,而成熟的花粉粒螢光顏色會不同。
  2. 損傷識別:受到臭氧傷害或真菌傷害的植物組織或花粉粒螢光也會改變,真菌產生的螢光和植物組織也不同。
  3. 雌蕊的螢光會因為花粉的種類而不同,會改變螢光的波峰和強度。
  4. 乾燥的分泌細胞和新鮮的分泌細胞產生的螢光不同。

其他部分,我看到王小發在科學堂社團中整理了更多文獻資料
https://www.facebook.com/groups/1960895877510713/permalink/2080906335509666/

使用科學Maker的落射螢光模組觀察保衛細胞的紅色螢光

九月初看到科學Maker上,江老師釋放出一款限量模組,是給手機顯微鏡使用的【螢光模組/進階落射螢光模組】,內含

  • 落射螢光的分光鏡cube 
  • 螢光模組A (紫光激發)


這個螢光模組真的很厲害,讓一般人也能使用到研究機構等級的螢光顯微鏡。江老師曾經在這篇貼文中,有提到兩款螢光模組的設計不同。電源方面,螢光A需要兩顆2032電池來供電,而螢光B只要一枚電池就可以。而濾片部分,螢光B需要多用一片濾片來濾出乾淨的螢光。

螢光


另外一個厲害的神器是【落射螢光的分光鏡cube】。組裝後是像下圖,將「分光鏡cube」裝在研究型手機顯微鏡的「通用物鏡模組」的載物板上,通用物鏡模組可以旋上任何標準的顯微鏡物鏡,模組上有小孔可以把分光鏡鎖上。




落射螢光的分光鏡運作原理是什麼呢?請Google一下螢光分光鏡(Fluorescence Beam Splitter)的圖片可以看到一些原理圖。在此模組中,其原理是將紫光平行射入分光鏡側邊的孔,分光鏡內的鍍膜玻璃把紫光反射經過物鏡到標本上,隨後標本產生的螢光通過物鏡向上通過分光鏡之後再進入觀測用目鏡。

來看看實際拍攝的結果,使用紫錦草來觀察。這是葉內維管束,旁邊還有一些葉肉組織。

我使用【十倍物鏡+通用模組+螢光落射模組+螢光A】在螢光顯微鏡拍攝下,可見葉綠素的紅色螢光和組織的綠色螢光
 使用同樣的設備找尋葉下表皮,看保衛細胞的螢光,在這倍率下,保衛細胞的螢光比起葉肉要遜色一些。

隨後我換成40倍物鏡來觀察,這是一般光源下的保衛細胞

而在此倍率下,微調入射的紫光就可以看見明顯的保衛細胞內的紅色螢光了。

2019年9月22日

用imagej的macro製作的無腦光譜分析程式


想要產生出如下圖這樣各種光譜分析圖,或是利用CFL燈泡(省電燈泡、日光燈等)來校正一整個資料夾的光譜照片,然後也是產生像下面這樣的圖。你覺得需要多少步驟呢?
只要兩個按鍵就好了喔,連輸入光譜值找對應的X座標都不用喔。





如何完成光譜分析呢?這部影片告訴你如何按兩個鈕就完成


程式碼

為什麼可以按兩個鈕就完成,連輸入波長都不用呢?因為我已經在程式中去做了那些工作。讓程式自動用hue值辨識光譜顏色、尋找波峰,再用預設的光譜值套入來進行校正。這樣的程式到底是怎麼製作呢,我也將程式說明錄了下來(其實這是避免自己將來萬一忘了)







如果是想要用imagej自己手動作這些工作,我在幾年前的文章曾經寫過,可以參考一下
用imagej作分光光度計與光譜儀的量測分析

2019年8月27日

用Javascript製作視野測定的程式

上週一個研究人員來詢問我十幾年前寫的一篇文章細節,他想知道《視野測定》的一些資料。詢問之後知道他是要做一些比較的實驗,不過用我當初寫的方式,做出來的結果我覺得會太粗糙。

於是週末的時候我就想應該可以寫個程式用電腦來進行測試。概念很簡單,就是讓螢幕先呈現一個小點,單眼靠近盯著它看,然後從旁邊慢慢移入一個色點,等到色點進入眼睛的視野時,就由測試者按鍵標定座標。重複上述步驟之後,再把這些色點的座標連起來就完成了。

不過要用什麼環境來做程式呢?一開始想到用python,不過應該找更容易操作的環境,後來就想到了用HTML5由Javascript來實現。

寫程式的過程其實是有趣的,因為沒寫過類似的程式,所以都要在網路上找程式寫法,找到答案之後,改寫成自己要的部份實作出來,成功了就很有成就感。可是要找答案,絕對不可能就把「視野測定」這樣的詞丟到論壇去找答案,我得先在腦中拆解問題,像是:
  • 用鍵盤移動螢幕圓點
  • Javascript的陣列操作方式
  • Javascript的資料呈現在html標籤內的方式
  • 資料儲存成檔案,和載入檔案的方式
最後就整理出了一個檔案,就像下圖這樣,可以設定每次測量的角度間隔,預設值是30度,所以總共會測試12個點。共會測試紅綠藍白四種顏色,然後紀錄的座標點都會顯示在螢幕上,最後可以按鍵作圖出來。
而考量實際做實驗的需求,有可能會要比較前次的實驗結果,所以我也做了存檔和載入檔案的功能。

唯獨要注意的是,如果是用這種手工《視野測定》的方法,紀錄的點就是視角,但這個看平面螢幕的紀錄方法,就單純是距離而已。

視野測定:檔案連結



使用方式則錄製成影片


2019年8月23日

到台中霧峰看看為猛禽搭的架

前幾天公共電視的節目《我們的島》播出了一個單元-為猛禽搭架

那是紀錄屏科大野保所團隊在台中霧峰五福社區進行的「邀黑翅鳶來捕鼠」的棲架推廣活動。記得在去年,就曾經在上下游看過這相關的活動,那是在高屏地區進行過的活動-邱靜慧/邀黑翅鳶幫農人抓老鼠!設置人工棲架DIY趕緊來


為什麼要幫猛禽搭棲架呢?無非就是食物鏈以及生物防治的概念。老鼠在田間常常會造成莫大的農損,除了破壞農作的根系,也可能挖洞破壞土堤影響田間保水。要一勞永逸除去鼠患,最直接的想法就是田間放老鼠藥來毒殺老鼠,但這樣卻反而讓吃老鼠的猛禽死亡。

不放老鼠藥來毒老鼠那怎麼辦呢?乾脆就讓猛禽來吃老鼠吧!其實猛禽吃老鼠本來就是再自然不過的事情了,只是現在現在棲地改變的情況下,會在田間吃老鼠的猛禽就沒有那麼多了。那麼如何吸引猛禽來田間呢?這集《我們的島》就是介紹這樣一個活動,搭了棲架之後,的確在後續觀察到黑翅鳶會前來在棲架上覓食、進食或交配。

看到這集的介紹,覺得實在好有趣,隔天就驅車前往看看棲架,幸運的話說不定還可以看到黑翅鳶?其實光看節目也不太確定到底棲架在哪,不過節目上有出現一個福德祠,我們就憑著這個印象前往了。正巧附近的便利商店外就有當地導覽圖,對照一下就找到了。


在節目中有提到,要能以猛禽做生物防治,該田間就是要符合不用藥的大前提,不然猛禽被吸引來了,不就被二次毒殺了嗎。




我四處張望算算這附近立的棲架只看到三根,不過看之前的新聞說有立了五根耶。










不過沒關係,在福德祠裡就有黑翅鳶的照片,拿起望遠鏡遠遠看這些照片,意思也是差不多啦。






想去這個點看看的,其實Google Map上搜尋「穀稻自然田」,就可以找到了喔。不過福德祠是在田間,開車是進不去的,然後附近的路是一輛車寬的小路,所以停在外頭慢慢散步過去也不錯。

2019年8月14日

用循環紙圈記憶分析血液循環途徑

上暑期輔導時,有幾個學生一直弄不懂幾個循環途徑的路線,像是肺循環、體循環、充氧血、減氧血等。其實循環路徑的口訣都是背過很多次的,那些「肺靜左房左室主動脈 大靜右房右室肺動脈」。只是說學生對於切分的分析有困難,於是我就弄了一個小紙圈來教他們。

先把這些詞在Excel上輸入,然後印出來剪下再黏貼。





檔案連結


實際使用的流程就如這個影片所示

2019年8月4日

關於《用漱口水取得的大片口腔皮膜組織》想起的科學素養

關於這篇《用漱口水取得的大片口腔皮膜組織》,寫完之後突然想到和素養有很大關係耶。

素養是什麼?素養指的是「個人為了適應現今生活及未來挑戰,所應具備的知識、能力與態度」,那麼我就藉由上篇來談談科學素養吧。(是說這主題也跳太多了吧。)

當你在生活中看到了現象,發想了問題《漱口後出現白膜,那是什麼?》你會怎麼找答案。

上網查幾乎是大多數人的答案,但是查到的答案真的可信嗎?對我來說,我沒有看到足夠有公信力的網站告訴我那是什麼,最多都只有看到分享這樣經驗而已,所以實質上並沒有解答我這樣的問題,上網查了之後,頂多是讓我知道....原來我不孤單,喔不,是原來這並非單一個案,意思就是這不是偶發的事件。

接下來我針對這個問題想了很多答案,這些就是假說,像是「漱口水引起的皮膜脫落」、「漱口水乾掉產生的」、「漱口水和唾液混合產生的」、「口腔裡細菌形成的生物膜」。

這些假說都可以藉由實驗來證實,前一篇雖然只有說我實際用顯微鏡觀察那白膜,但其實我有針對幾個假說都有實際進行實驗觀察。

而在進行用顯微鏡觀察的實驗,我應用了過去學習的知識和能力,像是如何用顯微鏡觀察,用染色讓觀察物變得明顯。最後我也用了我的知識去判斷那些東西是細胞。

因為我有了這些證據,因此我可以去驗證我的假說,所以我就可以產生一個論證:「我主張某牌漱口水會引起口腔皮膜細胞脫落,因為我用顯微鏡觀察過那些白膜,證實它們的確是口腔皮膜細胞」

不過這樣的證據是否充分呢?主張夠不夠強呢?其實是不夠的。

我後來也用其他的實驗方式來驗證,像是使用稀釋後的漱口水,或是其他品牌的漱口水,結果發現用了稀釋後的漱口水後,脫落的皮膜組織出現的量就少很多,而用了其他品牌的,則完全沒有出現脫落皮膜組織。


寫了這些,我們再來看看素養是什麼:個人為了適應現今生活及未來挑戰,所應具備的知識、能力與態度。

其實所謂的挑戰不一定和想像中的恐怖挑戰有關係,它也可能會是一些簡單到不行的生活小問題。從廚房料理的問題,到使用漱口水的問題,也有可能會是實驗室裡的科學問題。面臨這些大大小小的問題時,我們期待無論自己或是學生都會有足夠的知識能和態度能以合適合理的方式來面對和處理。

用漱口水取得的大片口腔皮膜組織

最近因為看了牙醫,用了一個某家四個字的漱口水,可是沒想到使用過後的隔天一早,卻發現嘴裡出現奇怪的白色東西,是有點像是白膜的東西。
搞不清楚是什麼東西,要知道答案看起來就是先上網查查看,結果發現不是只有我有這樣的經驗,但還是不確定那是什麼東西啊。
心中有幾個答案浮出來,可能是口腔皮膜,也可能是漱口水在嘴裡乾掉留下的東西,也有可能是漱口水和唾液產生了化學反應形成的。
有這些可能的答案,當然就要驗證一下囉,如何知道是不是口腔皮膜呢?那就用顯微鏡看看吧,如果真是口腔皮膜,那麼根據細胞學說,應該可以看到細胞才是。
那我就先蒐集一下這些白膜囉,找個燒杯裝水,把這些嘴裡留下的白膜放進去。在水裡這樣載浮載沉的東西真的是一片一片的膜耶,我本來還以為是膠結成一團的東西哩。



再來就是先染色囉,找了魚藥的甲基藍來染看看。染下去,就真相大白了,唉啊啊,這一大片東西都是口腔皮膜細胞啊,原來用了這四個字的漱口水後,會有很大量的口腔皮膜組織出現啊,後面猜測的幾個答案也不用特別去做了啊。



後來我就在杯裡找了一片大片的膜在玻片上拼起來了,居然還蠻大片的,背景一小格是1平方公分,你看它有多大啊。

國中生對口腔皮膜細胞或組織都應該熟悉,那是顯微鏡觀察時,唯一一個從自己身上取下的細胞。一般觀察時是用牙籤刮一刮抹在玻片上,通常看到頂多就是小小一片,或是散開的細胞。很少有機會能夠看到這樣小小的細胞構成一大片組織,而且這些是有很多層的細胞呢。話說後來這片有皮膜的玻片被我蔭乾保留下來了,看來是可以留下來當傳家之寶了。

用Imagej製作灰階影像加彩色線條的視覺效果


前幾天看到網路上流傳了一個在灰階影像上加上彩色線條之後,看起來就好像是彩色圖片的視覺效果,我看了覺得很有趣,很想自己來動手玩一玩。於是就用imagej玩看看,順便寫了一個code script放在文章底下,有興趣的可以複製貼上玩玩看。

可以做什麼效果呢?可以針對個別區域製作橫紋效果。下面組圖是用同樣粗細的線寬,但是不同的線距


也可以做出斜紋效果



或是直紋效果



這些線寬都不一樣,但是線寬和線距比例都是1:3



同樣的code改一改,也可以做出網紋的效果



以下就是教學影片了,前兩部是從原理製作開始講,如果要直接使用code來做的人,就從第三部來看就可以了。





以下就是imagej的macro囉
===========================
lineW = 2;
space = 8;
angle = 0;


run("Select None");
rename("color");
run("Duplicate...", "title=grey");

selectWindow("grey");
run("8-bit");
run("RGB Color");
run("Set Measurements...", "area bounding redirect=None decimal=3");
roiManager("Select", 0);
run("Rotate...", "angle="+ angle +"");
roiManager("Add");
run("To Bounding Box");
run("Measure");

BX = getResult("BX", nResults-1);
BY = getResult("BY", nResults-1);
Width = getResult("Width", nResults-1);
Height = getResult("Height", nResults-1);

lineN = floor(Height/(lineW+space));
print(lineN);
for (i = 0; i < lineN; i++) {
//建立選取區
run("Specify...", "width="+ Width +" height="+ lineW +" x="+ BX +" y="+ BY+(space+lineW)*i +"");
//run("Rotate...", "angle="+ angle +"");
roiManager("Add");
//交集運算
roiManager("Select", newArray(1,roiManager("count")-1));
roiManager("AND");
//產生要繪圖的選取區ROI
roiManager("Add");
roiManager("deselect")
roiManager("Select", roiManager("count")-2);
roiManager("Delete");

//roiManager("Select", roiManager("count")-1);
//roiManager("Delete");
}

a1 = newArray(roiManager("count")-2);
for (i=0; i<a1.length; i++)
  a1[i] = i+2;
roiManager("Select", a1);
roiManager("Combine");
roiManager("Add");

a1 = newArray(roiManager("count")-2);
for (i=0; i<a1.length; i++)
  a1[i] = i+1;
roiManager("Select", a1);
roiManager("Delete");


roiManager("Select",roiManager("count")-1);
run("Rotate...", "angle="+ -angle +"");
roiManager("Add");

//====複製原圖,貼到黑白圖====
selectWindow("color");
roiManager("Select", roiManager("count")-1);
run("Copy");

selectWindow("grey");
roiManager("Select", roiManager("count")-1);
run("Paste");
//=========================

roiManager("Select", newArray(roiManager("count")-1,roiManager("count")-2));
roiManager("Delete");

selectWindow("color");
run("Select None");

selectWindow("grey");
run("Select None");
rename(lineW+":"+space);

text = "w"+lineW+":space"+space;
setFont("SansSerif", 14, " antialiased");
makeText(text, 20, getHeight()-20);
run("Add Selection...", "stroke=yellow fill=#660000ff new");
run("Select None");

2019年8月1日

用Imagej做顯微追焦

顯微追焦是什麼?其實我也沒想過要怎麼去命名這種影片。我用以下的影片來說明好了,它就是把在顯微影片下,本來四處跑來跑去的生物,用影像處理讓它固定在同一個地方,甚至身體方向也固定下來。這跟攝影的追焦有點像啦,所以就叫顯微追焦囉。
處理成這樣的影片有什麼好處呢?我實作的結果,發現這樣更能夠更仔細看到這些生物的細節,或是運動方式。如果是原先到處跑的影片,你又要追它的位置,又要看清楚,那就實在太累了。



處理的流程是先標記生物的位置,然後用程式碼位移每個影格,讓標記的位置都放在同一個地方,然後你就可以裁切獲得追焦後的影像。
這系列的教學影片共有四集,會用到兩種簡單的程式碼,分別是「用點標記」和「用線標記」的兩種。程式我就貼在文章最底下
要使用這些程式,就只要在Imagej中開啟File/New/Text Window
把以下的程式按照需求貼在那window就好了(要確認功能表上的Language,看一下勾選IJM喔)。











=====用點標記的======
origin_x= getWidth/2;
origin_y= getHeight/2;
for (i = 0; i <  nResults ; i++) {
slice_x = getResult("X", i);
slice_y = getResult("Y", i);

translate_x= origin_x-slice_x;
translate_y= origin_y-slice_y;

setSlice(getResult("Slice", i));
run("Translate...", "x="+translate_x+" y="+translate_y+" interpolation=None slice");
}

====用線標記的=========
origin_x= getWidth/2;
origin_y= getHeight/2;
for (i = 0; i <  nResults ; i++) {
BX =  getResult("BX", i);
BY =  getResult("BY", i);
W =  getResult("Width", i);
H =  getResult("Height", i);
A = getResult("Angle", i);

if(A>-180 && A<=-90){
X=BX+W;
Y=BY;
}
if(A>-90 && A<=0){
X=BX;
Y=BY;
}
if(A>0 && A<=90){
X=BX;
Y=BY+H;
}
if(A>90 && A<=180){
X=BX+W;
Y=BY+H;
}


translate_x= origin_x-X;
translate_y= origin_y-Y;
rotate_A = A + 90;
setSlice(getResult("Slice", i));
run("Translate...", "x="+translate_x+" y="+translate_y+" interpolation=None slice");
run("Rotate... ", "angle="+ rotate_A +" grid=1 interpolation=Bilinear");
}
==============

2019年7月17日

焚風來時看雪山圈谷

今天由於東風過山,因此產生了焚風。在下午時,整個新竹苗栗到台中都紫起來了2019-07-17_1300.GTP8
同一時間在衛星雲圖上,也看到這些地方清晰無雲,顯示這裡是氣流下沉區域
TWI_VIS_TRGB_1375-2019-07-17-13-40

既然無雲,就來從新竹眺望一下雪山山脈

雪山圈谷02

果然這北稜角下的雪山圈谷還真是明顯可見啊。(冬天看雪山圈谷積雪可以看這篇
雪山圈谷01

聲學分析軟體Raven lite的使用教學

Raven lite是一個聲音的分析軟體,由康乃爾大學鳥類學實驗室所開發。其付費版本稱為Raven Pro,而Raven lite是輕量化的版本,免費使用,但須註冊取得註冊碼。

Raven lite能直接將聲音進行頻譜分析產生頻譜圖,並且能對聲音的頻譜標記或是做濾波分析,是聲學研究的好工具。

以下我錄製一些影片放置於此播放清單,說明如何註冊以及使用流程教學
https://www.youtube.com/playlist?list=PLm6x13NbsKl4OjMA9y8KwQYwx03ZPdCTX

2019年7月8日

imagej+colab機器學習作細胞分割

這是延續前篇的續作。

前一篇用了imagej的macro做了細胞的分割,不過實際上我認為誤差還是蠻大的,心裡想著應該還有更好的方法。想著想著突然想到這個問題,其實用機器學習的監督式學習可以解決。

只要把每個細胞團的參數拿出來餵給機器去學習,告訴機器「這種細胞團參數叫做一個細胞,那個細胞團參數叫做兩個細胞....」,當機器學會之後,就可以讓機器去預測那些細胞團是由幾個細胞組成的就可以。不過要做這樣的人工智慧,前提得先有工人智慧,我需要先人工辨識標記好每個細胞團到底是幾個細胞組成。

標記好或是機器學習預測好之後,我還需要有檢核的程式,讓我可以肉眼比對到底分類的結果如何。

整個機器學習的檔案架構是這樣的

├── dataSet_predict   用來預測的文件
│   ├── Cells
│   ├── Results
│   └── Roi
├── dataSet_train   用來訓練的文件
│   ├── Cells
│   ├── Results
│   └── Roi
├── image     圖像的資料夾
│   ├── predict
│   └── train
├── ImageCombine
└── macro
    ├── cellSegment.ijm
    ├── checkModel.ijm
    ├── makeModel.ijm
    └── MakePredic.ijm


看起來很複雜,不過使用者只要記得把細胞的圖像分成兩部份,一部分放在image/predict,一部分放在image/train。當然train量一定是比較少的啊,我們是要用train裡的圖像來預測predict裡頭的圖像啊。

程式的部份我做了四支程式,三支是在imagej下執行,一支是python,讓它在colab來執行。先介紹三支imagej的程式
makeModel.ijm  執行之後選擇圖片所在的資料夾,自動會產生相關的文件,放在train的資料夾裡
checkModel.ijm  用來檢查那些人工標記或是電腦辨識之後的分析結果是否正確
MakePredic.ijm 用來產生預測用的檔案

決定把機器學習的檔案放在colab上執行,是想說這樣使用者就省去自己部屬python環境的時間,反正只要上傳訓練檔案,等個十幾秒後自動會下載分析後的檔案



整個完整的分析、人工標記、上傳的流程,我照慣例錄製成影片說明。有需要的可以看看



整個程式檔和範例都放在雲端
https://drive.google.com/drive/folders/1m4MxOdCAziTr3tdNQhKP8H6y6nqfCNoz?usp=sharing


2019年6月27日

以imagej的macro實作GUI,進行重疊細胞的分割

上週五收到一個生技公司人員的來信,信中問到要作細胞的分割來計數,但是作分水嶺分割時出現問題。我寫imagej作細胞分割的文章其實寫了好幾篇,本來想說請他看看之前文章就好。不過因為給的圖片很漂亮,剛好議題又是我感興趣的,所以就試試看來解決了。

來看一下圖片。這是利用不同劑量的藥劑處理非癌化細胞後,再以螢光染劑進行染色。研究者的目的是要計算這有多少細胞。


由於有些細胞是重疊的,一般想法就是直接作分水嶺切割,然後再作analyze particles。不過這樣的作法會有大問題。


這是我們期待看到的,兩個細胞被分水嶺算法剛好切開。



但實際上會發生的是,單獨一個細胞往往會被切成好幾塊



或是兩個細胞被切成三塊



如何解決這樣的問題呢?
解決流程是這樣的
(1)先把單獨未重疊的單顆細胞抓出,並計數。
(2)只針對重疊的細胞作分水嶺切割,然後作計數。

現在問題來了,怎麼知道誰是單顆細胞,這裡會運用一個形態學的運算方式來幫助判斷。
以下兩張圖是先將圖片做threshold處理後,轉二值化影像,再用wand tool選取後,然後用Edit/Selection/Convex hull做出的新選取區。

convex hull是個重點!它就像是用條橡皮筋套住你的選取區,產生的新選取區就是convex hull。你看第一張圖片,是兩個細胞重疊,用convex圈起之後,會留下很多沒圈到的地方。第二張圖片是單獨的細胞,圈起來之後留下的空白很少。

所以啊,我們可以用convex hull和細胞的面積做運算,看看細胞在hull裡頭佔面積的多寡來推論那是不是單獨的細胞。








要計算這個東西,其實不用自己手動一個一個圈細胞。在measure中的測量值solidity就是這個啦。你可以勾選Analyze/Set Measurements/Shape descriptors,就可以呈現出這個數值了。





接下來的分析和製作Macro,我就交給影片說明了


影片中所使用的Macro 就是以下的文字啦

=============================================
Dialog.create("Preference");
Dialog.addNumber("solidity:", 0.88);
Dialog.addNumber("cell area min :", 2000);
Dialog.addCheckbox("Single cell fill color", true);
Dialog.addCheckbox("Watershed cell fill color", true);
Dialog.show();
solidityValue = Dialog.getNumber();
cellAreaMin = Dialog.getNumber();
singleCheck = Dialog.getCheckbox();
watershedCheck = Dialog.getCheckbox();

//關閉所有圖檔
run("Close All");
//製作結果表
Table.create("cellCounts");

//打開資料夾,取得檔案list
dir = getDirectory("Choose a Directory ");
list = getFileList(dir);
filecount = 1;
listFiles(dir);

function listFiles(dir) {

for (i=0; i<list.length; i++) {
if (endsWith(list[i], "/")){}

// listFiles(""+dir+list[i]);
else{
//print((filecount++) + ": " + dir + list[i]);
open(dir + list[i] );
bname=File.nameWithoutExtension;
cellCounts();
}
}
}

function cellCounts(){
//細胞有幾個
cellNum_single=0;     //一個單獨的細胞
cellNum_overlap=0;     //重疊的細胞團
  cellNum_watershed=0;  //分水嶺切割後,單獨的細胞

rename("original");

//製作空白的檔案
run("Duplicate...", "title=cell_single");
run("Select All");
setBackgroundColor(255, 255, 255);
run("Clear", "slice");
run("Duplicate...", "title=cell_overlap");
run("Duplicate...", "title=cell_watershed");

//分析前處理
selectWindow("original");
run("Duplicate...", "title=a");
run("8-bit");
setAutoThreshold("Default dark");
run("Convert to Mask");

//把所有細胞都抓出,設定measure參數
run("Set Measurements...", "area perimeter shape redirect=None decimal=3");
run("Analyze Particles...", "size="+cellAreaMin+"-Infinity circularity=0.10-1.00 display exclude clear include add");

//用Solidity推斷細胞是否有重疊
numROIs = roiManager("count");
for(i=0; i<numROIs;i++) {// loop through ROIs
solidity = getResult("Solidity", i);

if(solidity>solidityValue){//Solidity大於0.88者,應該是單顆細胞
cellNum_single =cellNum_single +1;
//塗色
if (singleCheck){
selectWindow("cell_single");
roiManager("Select", i);
setForegroundColor(255*random, 255*random,255*random); //隨機填入顏色
run("Fill");
}
}

else {//如果是小於0.88,可能是多個細胞重疊,進入迴圈作分水嶺切割
cellNum_overlap =cellNum_overlap +1;
selectWindow("cell_overlap");
roiManager("Select", i);
setForegroundColor(0,0,0); //填入黑色
run("Fill");

}
}

//到cell_overlap的圖片中,執行分水嶺算法
selectWindow("cell_overlap");
run("Make Binary");
run("Watershed");
run("Select All");
run("Analyze Particles...", "size="+cellAreaMin+"-Infinity circularity=0.10-1.00 display exclude clear include add");
numROIs = roiManager("count");
for(i=0; i<numROIs;i++) {// loop through ROIs
cellNum_watershed =cellNum_watershed +1;
if(watershedCheck){
selectWindow("cell_watershed");
roiManager("Select", i);
setForegroundColor(255*random, 255*random,255*random); //隨機填入顏色
run("Fill");
}
}

//輸出細胞的計數結果
rowsize = Table.size("cellCounts");
Table.set("filename", rowsize, bname,"cellCounts");
Table.set("cell_single",rowsize, cellNum_single,"cellCounts");
Table.set("cell_overlap",rowsize, cellNum_overlap,"cellCounts");
Table.set("cell_watershed",rowsize, cellNum_watershed,"cellCounts");
Table.update("cellCounts");

//關閉圖檔
selectWindow("cell_single");
saveAs("Jpeg", dir+"1/" + bname+"_1_single"+".Jpg");
selectWindow("cell_overlap");
saveAs("Jpeg", dir+"1/" + bname+"_2_overlap"+".Jpg");
selectWindow("cell_watershed");
saveAs("Jpeg", dir+"1/" + bname+"_3_watershed"+".Jpg");


close("cell_single");
close("cell_overlap");
close("cell_watershed");
close("a");
close("original");
close("Results");
close("ROI Manager");
}

2019年6月21日

以Onshape製作有卡榫的雷切盒子

像下圖這種有螺絲卡榫T slot的壓克力盒子,在網路上可以找到一些製作程式,例如inkscape的外掛,Google相關的關鍵字可以找到一些。

不過用2D的軟體製作時,遇到一些要微調或組合調整的時機時,有時候會難以想像,所以若是能以3D建模軟體製作,應該能夠省事一些。

目前線上3D軟體很多,這篇介紹的Onshape只是其中之一,功能強大值得學習。只要用瀏覽器就可以執行,不需要另外安裝更新軟體,檔案也都是雲端儲存。目前有教育版可以使用,只要簡單註冊程序即可。

製作的成品如下



組合出來的樣子會是這樣





軟體可以產生供雷切機使用的dxf檔案


可以製作爆炸圖,看各個零件的關係





如何入門這套軟體?Onshape的Learning Center有一系列的教學課程,我推薦跟著其中的Learning Pathways學習,可以順利跨過入門階段,能夠恣意利用軟體製作想做的模型。

以下這個播放清單是我製作雷切盒子的教學影片,如果你有興趣以Onshape製作類似的模型,也可以參考這個影片來學習製作。影片總長1小時30分。


2019年6月12日

關於寄生

因為昨天可能吃到了很多海獸胃線蟲,結果晚上做夢就夢到了很多蟲,最特別的是夢到我抓到了一隻巨大熊蟲﹑足足三公分大啊。要知道如果用肉眼看熊蟲,充其量就是個小點點而已,我可是夢到了一隻巨無霸啊。


既然講到寄生,就來寫本書的紀錄,「繪圖解說-寄生蟲的世界」,是去年出版的,作者是長谷川英男,日本的寄生蟲學者。

書裡一單元提到何謂寄生,作者提了幾個有趣的知識,生物的交互關係其實是會在不同情況下改變的。

就以小丑魚和海葵兩者來說,小丑魚會住在海葵的觸手之間,因為其他魚類會被小丑魚觸手的刺絲胞傷害,所以不會靠近海葵。但是小丑魚體表會分泌不會刺激刺絲胞的黏液,所以牠就可以安然無事躲在觸手之間。就海葵的角度來說,小丑魚算是片利共生的傢伙,因為自己不會得到好處。

但是當小丑魚會來驅趕其他吃海葵觸手的魚類,或是清除海葵觸手之間的垃圾時,這時關係又變成了互利共生。然而小丑魚有時也會吃掉海葵的觸手,那麼這關係卻又偏向寄生了。

再以鮣魚這種會藉由吸盤吸附在大型魚類身上來移動的魚類來說,這種關係對於大魚來說沒好處也沒壞處,算是片利共生的例子。其實身上黏著一條條魚,行動也很麻煩吧。然而鮣魚有時候又會吃掉在大魚體表的寄生型甲殼類,這樣的關係又會成了互利共生。

再來是螞蟻和蚜蟲這課本常提的互利共生例子,其實蚜蟲如果沒有辦法發揮功能的話,螞蟻也會吃掉牙蟲的。那這樣又成了捕食關係。

而牛和其體內的微生物,那些原生動物、細菌們之間的關係也很複雜,牛吃下的草料是藉由微生物的作用才能消化纖維素讓牛獲得養分,如此的關係成了互利共生。但是微生物在牛反芻後就會被胃液殺死消化,成了牛隻的營養,啊這樣的關係又成了什麼。





書中p.10還有一篇講到有寄生蟲的動物群。其實說寄生「蟲」也不好,因為有些根本不是蟲。

在這圖片中列出了動物的類群,類群上頭的符號黑圈圈或白圈圈代表了此類群有寄生種,即使是脊椎動物也有寄生的物種喔。像是八目鰻、盲鰻會吸附在其他魚體身上吸血或是侵入魚體吃牠們的內臟(就這點看來是捕食囉)。

有種會住在海參腸子裡的潛魚會吃掉海參的生殖腺,讓海參無法生殖

有部分種類的鮟鱇魚,其雄魚會和雌魚的身體融合,寄生在雌魚身上。

杜鵑鳥有產卵在其他鳥類巢中的社會性寄生行為。

圖中的演化樹是參考 佐藤 矩行  発生と進化 (シリーズ進化学 (4)) 単行本 – 2004/6/8

2019年6月11日

生物遊戲之蝙蝠捉飛蛾

這個活動最早是在一次去新竹自然谷參加攀樹活動時親身玩過的。而最近又在這本《全世界孩子都想上的自然探險課:來自「森林學校」的遊戲教育與成長指南》書裡又看到這個活動。

想起前次段考時,考了一題蝙蝠捉蛾與演化有關係的活動,於是就在下課前十分鐘,讓學生玩玩這個遊戲。

材料很簡單,就一個眼罩和一個空曠的場地。不過我沒有眼罩,所以就用口罩代替了。
一個學生當蝙蝠,戴上眼罩。另一位學生當蛾,可在場地裡自由移動。其他學生擔任樹,必須圍住場地。

活動的原則是蝙蝠發出超音波覓食,當超音波碰到飛蛾時,飛蛾會反射超音波,蝙蝠就會知道前面有飛蛾,可以前去覓食。而蝙蝠也會發射超音波來偵測樹木在哪裡,藉此避開樹木。

不過我們模擬活動是沒有辦法發出超音波的,所以就由蝙蝠小朋友自己選自己要發出什麼聲音,有人選「啊」,有人選「逼」還有人選「亞美蝶」(選這麼長的字很慘,因為要整場一直亞美蝶亞美蝶的叫」

擔任飛蛾的小朋友也是選一個聲音,當蝙蝠朝著你叫的時候,你就要發出那個聲音。其實應該要跟著蝙蝠一樣的聲音才對,不過我就讓他們自己選。想不到要發什麼聲音,那就發「蛾蛾蛾」

當樹的小朋友也很忙,因為當蝙蝠朝著你叫的時候,你要反射回去啊。如果想不到要發什麼聲音,那就發「樹樹樹」。

活動在樹圍起來的場地中進行,飛蛾可以自由飛行,但是不能離開樹的範圍。而樹要保護好蝙蝠,不能讓蝙蝠誤闖到界線外,可能會有危險。蝙蝠必須在時間內快速用「超音波」找到飛蛾抓到牠。

活動就這樣,規則很簡單,但是會玩得很瘋狂。試試看,很有趣的!

生物遊戲之猜猜我是誰

最近在課程中進行一個活動,就名為「猜猜我是誰」吧!

進行方式是這樣的
準備一疊牌,是從病毒到哺乳類,每一種學過的生物。學生群中一人當自願者,到台前抽一張生物牌,而這張牌只有老師和此學生可以看,能夠知道那是什麼生物。而其他人是看不到的。

接下來,其他學生舉手問yes/no的問題,台前學生只能回答yes或no。例如「是生物嗎?」「是內溫動物嗎?」諸如此類的題目。台下學生必須用最少的問題來答出那張牌的生物是什麼,最後答對的人就可以拿到此題的加分。當然用的問題越多,加的分數就越少。

對於提問的學生,這是練習分類的一種好方法,要如何用精確的方式快速分類出生物。而對於回答的學生,他自己要很清楚這些問題的對錯。而老師的角色就是檢查學生是否有回答錯,適時給予協助。

此活動過程,可以視學生程度讓學生拿筆記或課本來提問,或是讓學生空手提問也是一種挑戰。

在幾次活動中,也有些有趣的插曲,例如有些學生在前面縮範圍的題目都是靜靜不說話,但是當答案已經呼之欲出時,就會跑出來撿尾刀,殺個措手不及啊。

我沒有要吃海獸胃線蟲謝謝

大學時有一門課叫做寄生蟲學,修課前學長諄諄教誨,上課前要吃飽,不然上完課就會不敢吃東西。

果然,那門課上完後,我再也沒有吃過白帶魚,也沒有用手直接摸蝸牛,更別說是碰觸鳥大便。不吃白帶魚是因為那時要觀察海獸胃線蟲時,只要去買一條白帶魚幾乎都可以看得到,在魚體內長什麼樣子,Google一下就看得到。

過了幾十年後的今天中午,覓食時想說吃個口味重的,揀了一塊白帶魚來吃,就在快要吃光光的時候,眼睛仔細看了筷下的肉,滿嘴的飯和魚肉一時不知道該吞下去還是吐出來。

雖然知道這些蟲煮熟了也是蛋白質來源,但是看到一群在魚肉上還是抖了兩下。抖了第二下是因為都已經吃到這樣了才發現,那之前吃下的那些哩?我想吃口味重的,但是沒有想要吃口味這麼重的線蟲動物門啊!

後記:臉書上一提,結果好多人都吃過,因為有些人以為是血管就一樣吃下去了。

2019年5月30日

一個人擇育種的APP: Wiglet Hatchery

這個APP叫做Wiglet Hatchery,只有在iOS才能使用


這個可以玩什麼呢?就是育種啊。

一開始螢幕上會有兩隻怪東西,你可以把牠們倆個拖曳進白色的圓框後,按下splunge之後,就可以生出小孩。點擊螢幕右下角的Feed Me,可以餵食小孩加速牠長大。

而這個小孩長出來的樣子,就是有點像雙親,但是又不完全相同,也就是有性生殖的原理啊。接下來你可以再讓小孩跟雙親之一交配,然後可以繼續生出有點像又不太像的小孩。


玩了幾回之後,你可能會發現不能再生了,(這是負荷量的概念啊)。因為這個螢幕只能放六隻而已,如果要再生,那麼一定要有遷出或是死亡。
遷出的方式,就是點擊動物之後,再點擊【put into world】,牠就會被放在你iPad定位所在的位置,其實也沒消失,改天你螢幕裡少於六隻的時候,你還可以點右下角的地球去把牠找回來。或者你也可以按下Delete,就可以讓這隻可憐的小動物消失在這環境中。要注意在這環境中的六隻中,第一代的那兩隻是不能搬走的,你就算想搬也搬不出去啊。

而那一開始的兩隻,還有突變的選項呢!當你點擊那兩隻的時候,會出現有DNA的圖像,點下去之後牠就會突變了。

你看看這樣一個APP居然可以藏了這麼多生物學概念在裏頭呢!在今年的課程裡,我就用這樣的APP玩了一些活動,例如讓學生挑戰一定要生出個怎樣的小孩,例如頭很大又有翅膀的小孩。那麼你可以想想怎麼做?

這個用來模擬人擇育種可是相當直覺的呢!


以下是操作影片


2019年5月29日

使用GeoGebra畫扭歪多邊形

用GeoGebra弄這個東西,純粹是學生在做數學專題時來問我的問題,因為他們想做扭歪多邊形,想看看那實際模型怎麼做。雖然他們似乎最後放棄這個題目,不過我做都做了,不如就試試看吧。

一開始我想說用OpenScad的Linear Extrude就可以做出一個了,不過想要做參數化的部分實在太多了,後來就想到用GeoGebra來試試看。

在看了一些教學影片之後,我也摸索出製作的方式,以下就是我製作扭歪多邊形的流程,分成數個影片。







從點到線到面都可以用參數化來處理,GeoGebra真的個很有趣的軟體。而且這軟體居然還可以輸出stl檔,也就是這個東西可以用來做出3D列印的數學模型呢!這可是我一直想要做的東西呢!




2019年5月12日

使用微距鏡拍攝多焦點合成微距影像

這篇文章是教你如何拍攝出多焦點合成的微距影像,這種合成技術叫做focus stacking。我在2007年寫過一篇【以Imagej合成全對焦影像】。時隔12年。這篇將會從用不同的拍攝硬體和軟體再寫一個不一樣的。


首先看一下以下這張組圖,這九張圖的拍攝條件幾乎都相同,只有一點不同,就是每張對焦的位置不一樣。



透過程式的處理後,可以製作成如圖的影像,從口器的鬚到前胸的花紋都是清楚的。
以下幾張圖都是用同樣的方式去達成的,至於怎麼製作呢?分為拍攝和後製兩個部份來介紹。







使用的工具、App和電腦軟體如下

  1. 手機微距鏡頭
  2. 手機App ,例如 Open Camera(Android手機的app)
  3. OTG線與滑鼠
  4. 電腦軟體EnfuseGUI

微距鏡頭裝設

使用顯微鏡目鏡,或天文望遠鏡目鏡或是科學Maker社團贊助取得的微距鏡都可以。

這裡示範的是顯微鏡的10倍目鏡



先將目鏡下方接鏡筒的部份旋下



我使用UHU patafix pro power 萬用黏土,把目鏡黏到手機上。我在這裡黏的目鏡方向是反向的,手機鏡頭是靠近目鏡的底部,而目鏡的觀看端則是會朝向標本。




手機用支架固定好(我用的是消波塊!),標本也是用萬用黏土固定好。




手機拍攝
APP我推薦使用OpenCamera,有兩種拍攝方式,第一種是用手機直接設定拍攝的對焦範圍,自動包圍式拍攝。第二種則是手動用滑鼠點對焦位置拍攝。


不過第一種的拍攝方式得要手機有支援Camera API2,有支援的手機會在設定(OpenCamera開啟按齒輪)中,最底下看到如圖的選項。如果看不到的,那就是你手機不支援。



如果選擇Camera API2之後,點選第一個紅圈後,可以看到FOCUS{}的文字,也就是包圍式的改變焦點拍攝。要拍攝的張數,則是在Number of photos那邊設定。至於拍攝的焦點範圍,則是圖中紅箭頭所指的兩處來設定,分別代表對焦範圍的起點和終點。設定好之後,在拍攝時就會直接拍攝數張不同焦點的影像,完全不用再手動改變焦點拍攝。




第二種方式是用滑鼠點的方式來拍攝多焦點微距影像,需要使用OTG線和滑鼠,用滑鼠游標來直接控制對焦位置。因為如果是用手指在螢幕上觸摸改變對焦位置,那麼很容易造成影像的偏移。在後製時,只要有一點點的偏移都會造成影像的品質下降。


請看此影片示範



後製方式

後製的軟體則是使用EnfuseGUI,根據說明文件的設定
將曝光和飽和度都調到0,對比調到1,勾選force hard blend masks,即可完成



操作軟體的影片如下

你可能對這有興趣

Related Posts Plugin for WordPress, Blogger...