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