【数字图像处理】实验四 图像分割

实验四 图像分割

  • 1 实验目的
  • 2 实验环境
  • 3 实验内容
  • 4 实验心得

1 实验目的

  1. 理解图像分割的基本概念。
  2. 理解图像边缘提取的基本概念。
  3. 掌握用阈值法和边缘提取方法进行图像分割。

2 实验环境

matlab

3 实验内容

1、采用阈值法实现图像分割,分别采用两种阈值选取方法实现。

%1)lab41.m
close all;
clear;
clc;

I=imread('lab4.jpg');
I=rgb2gray(I);
I1=double(I);

figure('NumberTitle','off','name','直方图');
%显示各图像
subplot(1,2,1);     imshow(I);     title('原始图像','FontName','宋体');
subplot(1,2,2);     imhist(I);     title('直方图','FontName','宋体');   ylim('auto');

J1=histSeg(I,0,120,0);
% J1=im2bw(I,120/255); 

figure('NumberTitle','off','name','直方图门限选择');
%显示各图像
subplot(1,2,1);     imshow(I);     title('原始图像','FontName','宋体');
subplot(1,2,2);     imshow(J1);     title('直方图门限选择','FontName','宋体');

J2=iterationSeg(I,0.1,0);
figure('NumberTitle','off','name','迭代阈值分割');
%显示各图像
subplot(1,2,1);     imshow(I);     title('原始图像','FontName','宋体');
subplot(1,2,2);     imshow(J2);     title('迭代阈值分割','FontName','宋体');

%Otsu阈值进行分割
T=graythresh(I);
J3=im2bw(I,T);

figure('NumberTitle','off','name','Otsu分割');
subplot(1,2,1);     imshow(I);     title('原始图像','FontName','宋体');
subplot(1,2,2);     imshow(J3);     title('Otsu分割——系统函数实现','FontName','宋体');
%2)直方图门限选择histSeg.m
function j=histSeg(i,T1,T2,n)

[width,height]=size(i);

for x=1:width
    for y=1:height
        if(i(x,y)>=T1&&i(x,y)<=T2)
            j(x,y)=n;
        else 
            j(x,y)=abs(n-1);
        end
    end
end
%3)迭代阈值分割iterationSeg.m
function j=iterationSeg(i,val,n)

[width,height]=size(i);
j=zeros(width,height);

T1=(min(i(:))+max(i(:)))/2;%计算输入图像灰度中值
%基于T1将图像分为left和right两部分
left=i<=T1;
right=i>T1;

%计算两部分灰度均值的灰度中值
T2=(mean(i(right))+mean(i(left)))/2;

while abs(T2-T1)<val%判断有无满足精度要求
    T1=T2;
    right=i>T1;
    left=i<=T1;
    T2=(mean(i(right))+mean(i(left)))/2;
end

%基于T2进行阈值分割
for row=1:width
    for col=1:height
        if(i(row,col)<T2)
            j(row,col)=n;
        else 
            j(row,col)=abs(n-1);
        end
    end
end

原始图像的灰度直方图
【数字图像处理】实验四 图像分割_第1张图片
直方图门限选择
【数字图像处理】实验四 图像分割_第2张图片
迭代阈值分割
【数字图像处理】实验四 图像分割_第3张图片
Otsu分割系统函数实现
【数字图像处理】实验四 图像分割_第4张图片

2、分别用Roberts,Sobel和拉普拉斯高斯算子对图像进行边缘检测,比较三种算子处理的不同之处。

%1)主函数lab42.m
close all;
clear;
clc;

I=imread('lab4.jpg');%输入图像
I=rgb2gray(I);

I1=im2bw(I);
J1=Roberts(I1);%用Roberts算子进行边缘检测
J2=Sobel(I1);%用Sobel算子进行边缘检测
J3=LOG(I1);%用Log算子进行边缘检测

% J1=edge(I,'roberts');%用Roberts算子进行边缘检测
% J2=edge(I,'sobel'); %用Sobel算子进行边缘检测
% J3=edge(I,'log'); %用Log算子进行边缘检测

figure('NumberTitle','off','name','边缘检测'),
subplot(2,2,1);imshow(I);title('原始图像','FontName','宋体');
subplot(2,2,2);imshow(J1);title('Roberts算子','FontName','宋体');
subplot(2,2,3);imshow(J2);title('Sobel算子','FontName','宋体');
subplot(2,2,4);imshow(J3);title('LOG算子','FontName','宋体');
%2)自定义Roberts算子Roberts.m
function j=Roberts(i)

[width,height]=size(i);%得到图像的长和宽
j=i;

%Roberts算子
Tx=[-1 0;0 1];  
Ty=Tx';

[n,n]=size(Tx);

for row=1:width-(n-1)
    for col=1:height-(n-1)%height
        mark=i(row:row+(n-1),col:col+(n-1));
        temp=Tx.*mark;
        tempX=temp(:);
        temp=Ty.*mark;
        tempY=temp(:);
        pointX=0;
        pointY=0;
        for loc=1:n*n
            pointX=pointX+tempX(loc);
            pointY=pointY+tempY(loc);
        end
        j(row,col)=abs(pointX)+abs(pointY);
    end
end
%3)自定义Sobel算子Sobel.m
function j=Sobel(i)

[width,height]=size(i);%得到图像的长和宽
j=i;

%Sobel算子
Tx=[-1 -2 -1;0 0 0;1 2 1];
Ty=Tx';
[n,n]=size(Tx);

for row=1:width-(n-1)
    for col=1:height-(n-1)
        mark=i(row:row+(n-1),col:col+(n-1));
        temp=Tx.*mark;
        tempX=temp(:);
        temp=Ty.*mark;
        tempY=temp(:);
        pointX=0;
        pointY=0;
        for loc=1:n*n
            pointX=pointX+tempX(loc);
            pointY=pointY+tempY(loc);
        end
        j(row+(n-1)/2,col+(n-1)/2)=sqrt(pointX^2+pointY^2);
    end
end
%4)自定义LOG算子LOG.m
function j=LOG(i)

[width,height]=size(i);%得到图像的长和宽
j=i;

%LOG算子
T=[-2 -4 -4 -4 -2;-4 0 8 0 -4;-4 8 24 8 -4;-4 0 8 0 -4;-2 -4 -4 -4 -2];
[n,n]=size(T);

for row=1:width-(n-1)
    for col=1:height-(n-1)
        mark=i(row:row+(n-1),col:col+(n-1));
        temp=T.*mark;
        temp=temp(:);
        point=0;
        for loc=1:n*n
            point=point+temp(loc);
        end
        point=point/(n*n);
        j(row:row+(n-1),col:col+(n-1))=point;
    end
end

自定义算子边缘检测
【数字图像处理】实验四 图像分割_第5张图片
系统函数edge边缘检测
【数字图像处理】实验四 图像分割_第6张图片

3、实现肺的分割,结果包括两部分:肺(白色显示)和背景(黑色显示)。

% lab43.m
close all;
clear;
clc;

I=imread('lab4.tif');
I=rgb2gray(I);
I1=double(I);

J1=iterationSeg(I,0.1,0);
J2=imcomplement(J1); %图像二值反转

L=bwlabel(J2,8);%连通标记
s = regionprops(L,'Area');%将连通标记结果对应连通区域计算面积
J2=ismember(L,find([s.Area]>=400&[s.Area]<=16000));%去除面积过大的(为背景)和面积过小的(为气管),得到肺实质初始区域

imwrite(J2,'lab52.tif');

figure('NumberTitle','off','name','迭代阈值分割');
%显示各图像
subplot(2,2,1);     imshow(I);     title('原始图像','FontName','宋体');
subplot(2,2,3);     imshow(J1);     title('迭代阈值分割','FontName','宋体');
subplot(2,2,4);     imshow(J2);     title('分割肺','FontName','宋体');

肺(白)和背景(黑)
【数字图像处理】实验四 图像分割_第7张图片

4 实验心得

进一步理解了图像分割和边缘检测。edge函数进行边缘检测的边缘并不连续。
关于肺的分割,其核心是将肺实质分割出来,而诸如躯干、气管等如果不加处理,后续计算量将增加。
【数字图像处理】实验四 图像分割_第8张图片

你可能感兴趣的:(数字图像处理,matlab,数字图像处理)