matlab图像分割(肺实质)
图像分割
【一
一、实验目的
- 熟悉各类边缘的性质;
- 深入学习并熟练掌握边缘检测的关键算子;
- 掌握基于阈值的分割方法、基于区域增长的方法以及基于分水岭算法的图像分割技术;
- 能够利用上述技术手段有效地解决实际中的图像处理问题。
二、实验环境
MATLAB R2010b版本、WIN 7计算机
三、实验内容
导入一张灰度制图CT.JPG;首先实现肺部结构的分割;接着关注的区域包括肺泡结节、血管网和支气管等;展开边界识别对比:应用Canny算子与Marr-Hildreth算子进行边界检测效果对比分析;最后完成目标区的提取过程;记录并展示每个步骤的操作图像,并系统性地对比分析各阶段的结果
提示:在处理肺部影像时:
- 首先应用一种适合的技术(对比学习过的不同阈值方法),生成对应的二值图象。
- 然后运用形态学操作获得肺实质模板。
- 将生成的肺实质模板与CT图象进行乘积运算以实现分离。
感兴趣域提取则可采用以下几种方法: - 阈值分割
- 区域生长
- 分水岭
灰度图像CT.JPG

阈值分割得到肺实质
分割肺实质 代码。
- 肺实质提取
提取肺实质算法流程如下:
(1)基于全局阈值的分割
(2)执行取反操作
(3)应用半径为13的标准圆形结构单元进行闭运算
(4)再次执行取反操作
(5)完成孔洞填充处理
(6)进行掩膜与原图的差集运算
(7)通过掩膜与原图的乘法获得最终肺实质图像
%%手动阈值分割
clc
clear all;
close all;
[I,map]=imread('CT.jpg'); %读入图像
subplot(241);imshow(I),title('原始图像'); %显示图像
J=imhist(I);
subplot(242);imhist(I),title('直方图'); %生成直方图并显示
[M,N]=size(I); %返回图像的行数和列数
for i=1:1:M %将i以步长1从1增加到M
for j=1:1:N %将j以步长1从1增加到N
if I(i,j)>80 %如果图像阈值大于80
g(i,j)=0; %则大于80的就变成黑的
else g(i,j)=1; %小于80就变成白的
end
end
end
x=size(g,1); %此处分别获得该图片的长度和高度
y=size(g,2);
m=round(y/3); %此处进行三等分并取整,因为y/3不一定是整数
for i=1:1:x %此处开始三个循环将一个图片分为三个图片
for j=1:1:m
g1(i,j)=g(i,j);
end
end
subplot(243);imshow(g1),title('二值图像');
se2 = strel('disk',17); % 半径为17的圆形结构元
image2 = imclose(g1,se2);
subplot(2,4,4); imshow(image2); title('经半径为17的圆形结构元闭运算');
tI=~image2;%取反
subplot(2,4,5); imshow(tI); title('取反');
img_fill = imfill(tI, 'holes');
subplot(246),imshow(img_fill), title('孔洞被填充的图像');
img_jian=img_fill-tI;
subplot(247),imshow(img_jian), title('模板');
%% 掩膜*原图
Im=rgb2gray(imread('CT.jpg')); %读入图像
lung1=uint8(Im);
lung2=uint8(img_jian);
lung=immultiply(lung1,lung2);
subplot(248),imshow(lung), title('肺实质');
分割效果

边缘检测&感兴趣区域提取
- 边缘检测
边缘检测(对比canny算子与marr-Hildreth算子) 感兴趣区域的提取可采用阈值分割方法 确定目标区域 属于编程实现范畴
%% 边缘检测
figure
I2=edge(lung,'log');
subplot(2,2,1);
imshow(I2);
title('log算子分割结果');
I3=edge(lung,'canny');
subplot(2,2,2);
imshow(I3);
title('canny算子分割结果');

Marr-Hildreth 算子(即 LOG 算子)的效果不如 Canny 算子显著,在某些情况下无法获得闭合且连续的边缘轮廓线。尽管如此,在抑制噪声的同时也会将原有的尖锐边缘变得平滑(即无法检测到这些边缘)。Canny 算子作为基于最优化理论进行推导的一种算法,在实际应用中其效果未必达到理论上的最优状态(即可能导致某些理想条件下无法实现的效果)。尽管两者都采用了高斯函数对图像进行平滑处理(即去噪),从而增强了抗噪声能力(即在去噪过程中可能会导致高频细节信息丢失),但 Canny 算子在处理高频细节方面略显不足(即可能导致部分边缘信息丢失)。此外,在检测和连接边缘时采用了多尺度检测策略,并结合方向性搜索方法以提高检测效率和准确性。
- 阈值分割
通过下列代码选择特定区域观察其直方图,确定人工选定的阈值
%% 阈值分割提取感兴趣区域
[M,N]=size(lung); %返回图像的行数和列数
subplot(223),imshow(lung), title('肺实质');
rect=getrect();
B=imcrop(lung,rect);
subplot(224);imhist(B),title('直方图');
%% 人工选定阈值进行分割,选择阈值为68
figure
T1=68;
for i=1:1:M %将i以步长1从1增加到M
for j=1:1:N %将j以步长1从1增加到N
if lung(i,j)>T1 %如果图像阈值大于68
lg(i,j)=0; %则大于68的就变成黑的
else lg(i,j)=1; %小于68就变成白的
end
end
end
subplot(2,2,1);imshow(lg),title('肺血管'); %保持原图,显示图像g
采用阈值处理方法提取出感兴趣区域(对于手动进行直方图分析时,默认选取双峰间谷底对应的灰度级作为分割门槛),通过上述方法进行图像分割后,在形态学上能够清晰地区分出肺部血管与肺实质之间的界限。尽管该方法存在一定的误差范围,在实际应用中用于检测血管内是否存在血栓时仍需谨慎评估其准确性。
- 区域生长
通过下列代码作区域生长,提取感兴趣区域
%% 区域生长
J=regionGrow(lung);
imshow(J),title('区域生长');
%% 区域生长函数
function J=regionGrow(I)
if isinteger(I)
I=im2double(I);
end
figure
imshow(I)
[M,N]=size(I);
[y,x]=getpts;%单击取点后,按enter结束
x1=round(x);
y1=round(y);
seed=I(x1,y1);
J=zeros(M,N);
J(x1,y1)=1;
sum=seed;
suit=1;%点的个数
count=1;
threshold=0.15;
while count>0
s=0;
count=0;
for i=1:M
for j=1:N
if J(i,j)==1
if (i-1)>0&(i+1)<(M+1)&(j-1)>0&(j+1)<(N+1)
for u=-1:1
for v=-1:1
if J(i+u,j+v)==0&abs(I(i+u,j+v)-seed)<=threshold&1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8
J(i+u,j+v)=1;
count=count+1;
s=s+I(i+u,j+v);
end
end
end
end
end
end
end
suit=suit+count;
sum=sum+s;
seed=sum/suit;
end
end
分割效果

基于区域生长法原理,在图像中将具有相似特征的像素点合并形成更大的区域。具体操作中可通过手动选择初始种子点并执行回车操作来完成初始标记,在随后的过程中系统会自动完成后续划分工作以生成最终结果图。
采用该算法后能够实现对血管内栓塞情况的精确判定功能。然而由于种子点选择不当导致效率较低的问题仍然存在。
值得注意的是当目标区与背景区之间存在显著差异时该方法表现良好但在感兴趣区与外围存在边缘相连的情况时可能会出现部分欠分割或过分割的现象。
