matlab图像分割(肺实质)

图像分割

  • 一、实验目的
  • 二、实验环境
  • 三、实验内容
    • 阈值分割得到肺实质
    • 边缘检测&感兴趣区域提取

一、实验目的

  1. 了解各类边缘的特点;
  2. 理解并掌握边缘检测的常用算子。
  3. 理解并掌握阈值分割,区域生长,分水岭等分割方法
  4. 能够运用以上方法解决实际的图像问题。

二、实验环境

MATLAB R2010b版本、WIN 7计算机

三、实验内容

读入一幅灰度图像CT.JPG,先分割肺实质区域,然后对感兴趣区域( 包括肺结节、肺血管和支气管等)进行边缘检测(比较canny算子和marr-Hildreth算子),最后提取感兴趣区。给出每步的实验结果图,并对结果进行比较分析。

提示:肺实质的提取可以先对图像进行阈值处理(比较所学的阈值方法,采用最优的),得到二值图像,然后进行形态学操作得到肺实质模板,将模板和CT图像相乘分割得到肺实质图像。感兴趣区域的提取可以运用阈值分割,区域生长,分水岭等方法。

灰度图像CT.JPG
matlab图像分割(肺实质)_第1张图片

阈值分割得到肺实质

分割肺实质 代码

  1. 肺实质提取

提取肺实质算法流程:
(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以步长11增加到M
for j=1:1:N                      %将j以步长11增加到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('肺实质');

分割效果
matlab图像分割(肺实质)_第2张图片

边缘检测&感兴趣区域提取

  1. 边缘检测

边缘检测(比较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算子分割结果');

matlab图像分割(肺实质)_第3张图片

Marr-Hildreth算子(LOG算子)没有Canny效果好,不过能够得到闭合的曲线,当然,计算量也比Canny小。LOG算子克服了Laplacian算子抗噪能力差的缺点,但在抑制噪声的同时也将原有的尖锐边缘平滑化了,造成尖锐边缘无法被检测出。Canny算子虽然是基于最优化思想而推导出来的,但是实际效果并不一定最优。同样采用高斯函数对图像平滑化,因此具有较强的抑制噪声能力,但也会将高频边缘平滑掉,造成边缘丢失。Canny算子采用双阈值算法检测和连接边缘,采用的多尺度检测和方向性搜索比LOG算子好。

  1. 阈值分割

通过下列代码选择特定区域观察其直方图,确定人工选定的阈值

%% 阈值分割提取感兴趣区域
[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以步长11增加到M
for j=1:1:N                      %将j以步长11增加到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

阈值处理提取感兴趣的区域(手动阈值分割的阈值是取直方图中双峰的谷底的灰度值作为阈值,若有多个双峰谷底,则取第一个作为阈值),经过阈值分割后肺部血管和肺实质其他部分可以分隔开,但由于此法误差较大所以用来观察血管内是个否存在栓塞不够准确。

  1. 区域生长
    通过下列代码作区域生长,提取感兴趣区域
%% 区域生长

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

分割效果
matlab图像分割(肺实质)_第4张图片

考虑区域生长算法,将相似的像素点聚合成更大区域。分割图像时可以用鼠标在其中选取一个种子点并按下回车键,之后会出现分割结果。应用区域生长算法,可以对某段血管内是否有栓塞进行精细判断,但由于种子点选取原因,效率较慢。另外,区域生长对于该区域与外界区域有明显差距的图像,分割效果很好,而对感兴趣区域与外接区域存在边缘连通现象的图像,分割效果很差,如分割不完整、过分割等。

你可能感兴趣的:(边缘检测,区域生长,阈值分割,matlab,图像处理)