% (图像分割)MATLAB胸部CT肺质提取
% demo
% by HPC_ZY 20190718
clear; close all; clc
load imset % 数据集
showflag = 0; % 是否显示中间图像
imidx = 1; % 测试图像序号
im = im2double(imset{imidx});
%% 1.阈值分割
% 全局分割
imbi0 = imbinarize(im);
% 基于轮廓像素分割
Eidx = edge(im,'log'); % 拉普拉斯获取边缘
E1 = im(Eidx); % 获取边缘像素
E1 = E1(E1>0);
imbi1 = imbinarize(im,graythresh(E1));
% 基于有效像素分割
E2 = im(im>0.02); % 获取非0像素
imbi2 = imbinarize(im,graythresh(E2));
if showflag
figure
subplot(221),imshow(im),title('\fontsize{16}原图')
subplot(222),imshow(imbi0),title('\fontsize{16}全局分割')
subplot(223),imshow(imbi1),title('\fontsize{16}基于轮廓像素分割')
subplot(224),imshow(imbi2),title('\fontsize{16}基于有效像素分割')
end
%% 2.提取人体部分
% 计算连通分量
[label,num] = bwlabel(imbi0);
% 计算最大连通分量
MAX = 0;
for k = 1:num
maxtmp = sum(find(label==k));
if maxtmp>MAX
IDX = k;
MAX = maxtmp;
end
end
imbi = label==IDX;
if showflag
figure
subplot(121),imshow(imbi0),title('\fontsize{16}二值图')
subplot(122),imshow(imbi),title('\fontsize{16}胸腔')
end
%% 3.提取疑似肺质
imbiFull = imfill(imbi,'hole'); % 填充
objtmp = imbiFull-imbi;
if showflag
figure
subplot(131),imshow(imbi),title('\fontsize{16}胸腔')
subplot(132),imshow(imbiFull),title('\fontsize{16}填充')
subplot(133),imshow(objtmp),title('\fontsize{16}疑似肺质')
end
%% 4.去除非肺质
P = 2000;
MASK = bwareaopen(objtmp,P,4); % 删除面积小于P的连通分量
if showflag
figure
subplot(131),imshow(objtmp),title('\fontsize{16}疑似肺质')
subplot(132),imshow(MASK),title('\fontsize{16}肺质MASK')
subplot(133),imshow(im),title('\fontsize{16}原图')
end
%% 5.其他优化操作
% 略
figure
subplot(221),imshow(im),title('\fontsize{16}原图')
subplot(222),imshow(imbi),title('\fontsize{16}胸腔')
subplot(223),imshow(objtmp),title('\fontsize{16}疑似肺质')
subplot(224),imshow(MASK),title('\fontsize{16}肺质MASK')