C#處理醫學影像(三):基於漫水邊界自動選取病灶范圍的實現思路


開發背景:

醫生在實際使用PACS軟件觀察病灶時,經常會測量不規則病灶的周長和面積,使用畫筆工具勾勒比較耗時且准度欠佳,

或者在標記人工智能訓練樣本時少則幾百張,多則幾千張,為極大減少耗時和極大提高工作效率,故開發此功能用來自動勾勒病灶范圍並自動測量。

 

國際慣例,先看效果:

 

思路流程概覽:

①以鼠標按下作為漫水算法中心點向外擴散填充

②裁剪最大外接矩形,縮小計算范圍

③灰度轉換

④Canny算子或Sobel算子提取輪廓

⑤背景降噪

⑥提取邊界輪廓

⑦設置容差范圍

⑧可變多邊形坐標轉化

⑨縮放、平移、旋轉后的坐標映射

 

准備一張樣本並以手臂骨頭作為假設病灶:

 

 

①以鼠標按下作為漫水算法中心點向外擴散填充

通過給定指定的中心坐標,和指定染色的顏色值,向四周擴撒,遇到一樣或近似值將其包含在范圍內,網上源碼很多,很容易實現。

 

 

②裁剪最大外接矩形,縮小計算范圍

將漫水填充范圍的最大外接矩形裁剪出來,提高后續計算效率。

 

 

③灰度轉換

轉換成灰度圖,為后續計算做准備。

 

④Canny算子或Sobel算子進行邊緣檢測

Canny算子和Sobel算子區別:

Canny算子:

在計算前先將圖像進行高斯濾波轉換,得到一個相對模糊的圖像,使得噪點在平滑過度時的影響降到最低:

 

根據算法原理得到如下結果:

 

Sobel算子:

根據算法原理得到如下結果:

 

其中直觀區別是canny算子計算的結果清晰,但不連續,容易受噪點影響,而sobel算子線條相對柔和,連續性強。

 

⑤背景降噪

進行一次手動背景降噪,使得展現的無用邊緣更少,結果更清晰:

 

⑥提取邊界輪廓

經過上面的計算后會得到一個邊界坐標集合記為List<Point> list;

這些點是不連續的,不首尾相連的,我們需要將非邊緣坐標刪除,並將邊緣坐標按順時針或逆時針排序;

 

 

此時雖然得到了邊緣坐標,但他是非連續性的,當我們把這些點連起來的時候就會出現問題:

 

 

所以我們將這些邊緣坐標按逆時針或順時針排序:

 

⑦在界面上增加滑塊控件並設置容差范圍

當碰到邊界不是很清晰的時候,我們需要調整容差范圍,以影響漫水擴散時的范圍准確性:

 

 

觀察容差范圍1020的區別:

 

 

⑧可變多邊形坐標轉化

根據本系列教程的測量工具開發,在此基礎上我們將標識的范圍轉化為可變多邊形:

微調結果並顯示周長和面積:

 

⑨縮放、平移、旋轉后的坐標映射

當圖像發生放大、平移、旋轉時,要注意邊緣坐標的映射以保證結果正確:

 

配合色彩增強,食用效果更佳!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM