開發背景:
醫生在實際使用PACS軟件觀察病灶時,經常會測量不規則病灶的周長和面積,使用畫筆工具勾勒比較耗時且准度欠佳,
或者在標記人工智能訓練樣本時少則幾百張,多則幾千張,為極大減少耗時和極大提高工作效率,故開發此功能用來自動勾勒病灶范圍並自動測量。
國際慣例,先看效果:
思路流程概覽:
①以鼠標按下作為漫水算法中心點向外擴散填充
②裁剪最大外接矩形,縮小計算范圍
③灰度轉換
④Canny算子或Sobel算子提取輪廓
⑤背景降噪
⑥提取邊界輪廓
⑦設置容差范圍
⑧可變多邊形坐標轉化
⑨縮放、平移、旋轉后的坐標映射
准備一張樣本並以手臂骨頭作為假設病灶:
①以鼠標按下作為漫水算法中心點向外擴散填充
通過給定指定的中心坐標,和指定染色的顏色值,向四周擴撒,遇到一樣或近似值將其包含在范圍內,網上源碼很多,很容易實現。
②裁剪最大外接矩形,縮小計算范圍
將漫水填充范圍的最大外接矩形裁剪出來,提高后續計算效率。
③灰度轉換
轉換成灰度圖,為后續計算做准備。
④Canny算子或Sobel算子進行邊緣檢測
Canny算子和Sobel算子區別:
Canny算子:
在計算前先將圖像進行高斯濾波轉換,得到一個相對模糊的圖像,使得噪點在平滑過度時的影響降到最低:
根據算法原理得到如下結果:
Sobel算子:
根據算法原理得到如下結果:
其中直觀區別是canny算子計算的結果清晰,但不連續,容易受噪點影響,而sobel算子線條相對柔和,連續性強。
⑤背景降噪
進行一次手動背景降噪,使得展現的無用邊緣更少,結果更清晰:
⑥提取邊界輪廓
經過上面的計算后會得到一個邊界坐標集合記為List<Point> list;
這些點是不連續的,不首尾相連的,我們需要將非邊緣坐標刪除,並將邊緣坐標按順時針或逆時針排序;
此時雖然得到了邊緣坐標,但他是非連續性的,當我們把這些點連起來的時候就會出現問題:
所以我們將這些邊緣坐標按逆時針或順時針排序:
⑦在界面上增加滑塊控件並設置容差范圍
當碰到邊界不是很清晰的時候,我們需要調整容差范圍,以影響漫水擴散時的范圍准確性:
觀察容差范圍10和20的區別:
⑧可變多邊形坐標轉化
根據本系列教程的測量工具開發,在此基礎上我們將標識的范圍轉化為可變多邊形:
微調結果並顯示周長和面積:
⑨縮放、平移、旋轉后的坐標映射
當圖像發生放大、平移、旋轉時,要注意邊緣坐標的映射以保證結果正確:
配合色彩增強,食用效果更佳!