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分。


你可能對這有興趣

Related Posts Plugin for WordPress, Blogger...