Matlab 肝脏图像分割

Posted

技术标签:

【中文标题】Matlab 肝脏图像分割【英文标题】:Matlab image segmentation for liver 【发布时间】:2016-12-14 13:18:40 【问题描述】:

我在 matlab 中的图像分割中苦苦挣扎。我的目标是从 ct 扫描图像中提取肝脏。 。

我为这个样本图像提取了肝脏,输出如下。 我的实现代码是

function [] = Code4( image_file )
image = imread(image_file);       
[height, width, planes] = size(image);
rgb = reshape(image, height, width * planes);
r = image(:, :, 1);             
g = image(:, :, 2);             
b = image(:, :, 3);             

% since r,g & b are of equeal values, we will be considering only r.

mask=r>120 & r<140 ;  % range of color component for liver
labels = bwlabel(mask);
id = labels(111, 200);

% get the mask containing only the desired object
liver = (labels == id);
imagesc(liver);
colorbar;

end

我的问题是当我改变图像时,肝脏部分的 rgb 值可能会不同。 这是其他示例图片

.

对于此图像,每个颜色分量(r、g 和 b)的 rgb 值从 160 到 190 不等。请帮我解决问题。

这是 rgb 范围从 110 到 180 的其他示例图像 .

请帮忙。

【问题讨论】:

您不能按值分割 CT 图像。它有噪音,CT值会发生变化。您需要使用一些更好的分割技术,例如水平集 @AnderBiguri 能否提供详细信息? 我会尝试在图像的一阶导数中找到轮廓,然后通过形态学操作将其放大以确保没有间隙,然后用洪水填充进行填充 也看看Fracture detection in hand using image proccessing @swapnilgandhi 不,它对 *** 来说太复杂了。您需要阅读一些论文/书籍 【参考方案1】:

不使用固定阈值,您可以尝试按灰度级对图像进行聚类。作为预处理步骤,我建议使用形态学开放来使相邻像素的灰度差异变小,从而减少聚类图像中的噪声。

下面我使用3x3 圆形内核对图像应用两个连续的形态开口,然后对灰度级应用k-means 聚类。从您的示例图像和我在互联网上找到的一些图像中,我决定设置k = 4。如果您使用的是高分辨率图像,请先将它们下采样到大约 400-600 的尺寸。否则形态学操作可能效果不明显,k-means会很慢。

以下是一些打开和分割的图像。当然还有很多事情要做

肝区分离 将其推广到大型数据集

但希望这至少是一个起点。

我没有matlab,所以代码在c++opencv,但是转换应该很简单,因为它只涉及形态和聚类操作,它应该有点类似于this。

更新 您可以通过过滤掉分割图像中最暗和最亮的区域来缩小区域或兴趣范围。为此,使用 k-means 聚类中心,检查极值(最大值和最小值)并从标记图像中删除相应的 k 值。然后您可以在结果图像的左侧查找大型结构。最坏的情况是,当极端区域过滤出错时,您可能会在左侧出现一个洞。我已经更新了代码和结果。

opencv c++ 代码

// load image as gray scale
Mat im = imread("5.jpg", 0);
// morphological opening
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
Mat morph;
morphologyEx(im, morph, CV_MOP_OPEN, kernel, Point(-1, -1), 2);
// clustering
int k = 4;
Mat segment, lbl;
vector<float> centers;
morph.convertTo(segment, CV_32F);
int imsize[] = segment.rows, segment.cols;
Mat color = segment.reshape(1, segment.rows*segment.cols);
kmeans(color, k, lbl, TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), k, KMEANS_PP_CENTERS, centers);
lbl = lbl.reshape(1, 2, imsize);

// find argmin and argmax to find extreme gray level regions
int minidx = min_element(centers.begin(), centers.end()) - centers.begin();
int maxidx = max_element(centers.begin(), centers.end()) - centers.begin();
// prepare a mask to filter extreme gray level regions
Mat mask = (lbl != minidx) ^ (lbl == maxidx);

// only for display purposes
Mat lbldisp;
lbl.convertTo(lbldisp, CV_8U, 255.0/(k-1));
Mat lblColor;
applyColorMap(lbldisp, lblColor, COLORMAP_JET);
// region of interest
Mat roiColor = Mat::zeros(lblColor.size(), CV_8UC3);
lblColor.copyTo(roiColor, mask);

imshow("opened", morph);
imshow("segmented", lblColor);
imshow("roi", roiColor);
waitKey();

【讨论】:

我非常想知道投反对票的原因,以便改进我的回答。 我没有投反对票,发现你的答案实际上很有趣,但这个问题对于 Stack Overflow 来说完全是题外话。这不是一个编程问题,而是一个图像处理研究项目。您的回答肯定指向正确的方向,但对离题问题的回答通常不受欢迎。 @dasdingonesin 谢谢。我只是发现这个问题很有趣,并想分享我尝试过的东西。 :)

以上是关于Matlab 肝脏图像分割的主要内容,如果未能解决你的问题,请参考以下文章

图像分割基于matlab纹理度量图像分割含Matlab源码 2329期

图像分割基于matlab纹理度量图像分割含Matlab源码 2329期

图像分割基于matlab超像素SFFCM图像分割含Matlab源码 1374期

图像分割基于matlab超像素SFFCM图像分割含Matlab源码 1374期

图像分割基于matlab改进的萤火虫算法优化二维OTSU图像分割含Matlab源码 2304期

图像分割基于matlab改进的萤火虫算法优化二维OTSU图像分割含Matlab源码 2304期