首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >肝脏的Matlab图像分割

肝脏的Matlab图像分割
EN

Stack Overflow用户
提问于 2016-12-14 13:18:40
回答 1查看 1.9K关注 0票数 0

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

我提取了这个样本图像的肝脏,输出如下

。我的实现代码是

代码语言:javascript
复制
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值可能是不同的。以下是其他示例图像

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

以下是rgb范围从110到180不等的其他示例图像

请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-18 05:22:02

在不使用固定阈值的情况下,可以尝试按灰度对图像进行聚类。作为预处理步骤,我建议使用形态学开度来使相邻像素的灰度差值很小,这样就可以减少聚类图像中的噪声。

下面我使用一个3x3圆形核对图像应用两个连续的形态学开口,然后将k-均值聚类应用到灰度上。从你的图片样本和我在网上找到的一些图片,我决定设置k = 4。如果您使用的是高分辨率图像,首先将它们降到400-600的尺寸.否则,形态学操作可能没有明显的效果,而且k-均值会变慢.

下面是一些打开和分割的图像。当然,还有更多的工作要做

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

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

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

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

opencv c++码

代码语言:javascript
复制
// 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();
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41143672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档