opencv用于医学图像分割
生活随笔
收集整理的這篇文章主要介紹了
opencv用于医学图像分割
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
初衷
最近比較閑,跟同學聊天講到他的課題:醫(yī)學圖像分割,提取左心室區(qū)域。
我就好奇要了原始圖片,發(fā)現超聲圖像果然比紅外圖像分辨率低,他指給我左心室所在區(qū)域。
思路
拿到這張圖第一眼,腦海里蹦出無數個小想法:
- 感興趣區(qū)域為一個扇形,所以首先制作掩模;
- 這種灰度分級模糊的圖像,若想分類,可以試試Kmeans,或者直接用閾值分割;
- 后續(xù)可以分析特征,通過邊界跟蹤一類得到。
具體流程
- 1、原圖通過k_means二分類,并得到二值分割圖;
- 2、形態(tài)學處理將粘連區(qū)域拆分,去除連通區(qū)域內部空洞;
- 3、掩模后只保留扇形內數據;
- 4、提取輪廓并以面積為評估對象做篩選;
- 5、歐式距離為評估對象,后續(xù)維護好目標跟蹤。(在后續(xù)分析視頻序列時,發(fā)現其實目標位置基本不會大的變化,只是在形狀發(fā)生變化,因此可以借助歐式距離跟蹤)
制作扇形掩模
查找opencv并沒有現成的繪制扇形函數,只有手動繪制了。
大概思路為:
- 1、繪制扇形的圓弧;
- 2、繪制兩條半徑,繪制半徑需要知道角點,所以牽扯些許三角函數的計算。
嘗試參數后,代碼如下:
//生成扇形輪廓,角度 void get_fans(Mat &img,cv::Point center,double angle, int radius) {ellipse(img, center, cv::Size(radius, radius), 0, 90 - angle / 2, 90 + angle / 2, Scalar(255, 255, 255), 3, 8);//計算扇形頂點坐標,先計算弦長和高int chord_len = radius*sin(angle*3.14 / (2 * 180));int height = radius*cos(angle*3.14 / (2 * 180));//一左一右,中心點加偏移量即為頂點坐標cv::Point corner_1 = center + cv::Point(-chord_len, height);cv::Point corner_2 = center + cv::Point(chord_len, height);line(img, center, corner_1, Scalar(255, 255, 255), 3, 8);line(img, center, corner_2, Scalar(255, 255, 255), 3, 8);}朋友只需要根據參數調整,就能得到他們項目所需要的掩模。這個程序只是生成一張扇形的輪廓,生成掩模,還需要提取輪廓重新繪制,并將內部填充。
這部分代碼如下:
完整代碼就不分享了,借用Kmeans在分類時存在需要不定時反色情形,在對視頻序列處理時,直接閾值化后效果也不錯。
Kmeans效果還是有那么點的:
總結
以上是生活随笔為你收集整理的opencv用于医学图像分割的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDE通信研究
- 下一篇: 经济学中ppf计算机会成本例题,经济学中