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

喬克灬叔叔發表於2022-03-18

開發背景:

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

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

 

國際慣例,先看效果:

 

思路流程概覽:

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

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

③灰度轉換

④Canny運算元或Sobel運算元提取輪廓

⑤背景降噪

⑥提取邊界輪廓

⑦設定容差範圍

⑧可變多邊形座標轉化

⑨縮放、平移、旋轉後的座標對映

 

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

 

 

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

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

 

 

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

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

 

 

③灰度轉換

轉換成灰度圖,為後續計算做準備。

 

④Canny運算元或Sobel運算元進行邊緣檢測

Canny運算元和Sobel運算元區別:

Canny運算元:

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

 

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

 

Sobel運算元:

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

 

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

 

⑤背景降噪

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

 

⑥提取邊界輪廓

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

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

 

 

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

 

 

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

 

⑦在介面上增加滑塊控制元件並設定容差範圍

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

 

 

觀察容差範圍1020的區別:

 

 

⑧可變多邊形座標轉化

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

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

 

⑨縮放、平移、旋轉後的座標對映

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

 

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

 

 

相關文章