MATLAB-图像分割

  • 实验目的

–掌握图像分割的原理

–掌握基于阈值的分割方法

–掌握区域生长算法

  • 实验原理

1.图像的二值化的基本原理

图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

2.迭代阈值法

(1)选择一个初始阈值T1

(2)根据初始阈值T1将图像 分割为G1和G2两个部分,分别求出G1和G2的平均灰度值m1和m2;

(3)计算新的阈值T2= (m1+m2)/2;

(4)如果| T1 – T2 |≤ T0,终止迭代。否则令T1= T2,重复步骤(2)和(3),最后的T2就是所求的最优阈值。

初始阈值T1的选取:

扫描二维码关注公众号,回复: 15257230 查看本文章

当目标与背景面积相当时,将T1设为整幅图像的平均灰度

当目标与背景面积相差较远时,将T1设为最大灰度与最小灰度的中间值。

3.质心型区域生长算法:

(1)确定初始种子点,阈值;

(2)对图像进行逐行扫描,找出尚没有归属的像素;

(3)比较已存在区域的像素灰度平均值与该区域邻接的像素灰度值,若差值小于阈值,则合并;

(4)以新合并的像素为中心,重复步骤(3),检查新像素的邻域,直到区域不能进一步扩张;

(5)返回到步骤(2),继续扫描直到不能发现没有归属的像素,则结束整个生长过程。

三、实验环境

– Windows XP/ Windows 7

– Matlab 7.0.1/ Matlab R2008

四、实验内容与步骤

1.实现固定阈值分割,完成对一幅灰度图像的二值分割,调整阈值,记录并分析实验结果;

A=rgb2gray(imread('pepper.png'));   %读取到一张图片  

thresh = graythresh(I);     %自动确定二值化阈值

I2 = im2bw(I,thresh);       %对图像二值化

figure(1)

imshow(I)     %显示二值化之前的图片

figure(2)

imshow(I2)    %显示二值化之后的图片

2.编写迭代阈值法程序,记录迭代得出的最优阈值,利用该阈值实现图像的分割;

I=imread('rice.png');

%设置初始阈值   去最大值和最小值的中间值

zmax=max(max(I));

zmin=min(min(I));

T1=(zmax+zmin)/2;

%根据阈值将图像进行分割为前景和背景,分别求出两者的平均灰度  z1和z2

b=1;

[m n]=size(I);

while (b)

        ifg=0;

        ibg=0;

        fnum=0;

        bnum=0;

        for i=1:m

            for j=1:n

                tmp=I(i,j);

                if(tmp>=T1)

                    ifg=ifg+1;

                    fnum=fnum+double(tmp);  %前景像素的个数以及像素值的总和

                else

                    ibg=ibg+1;

                    bnum=bnum+double(tmp);%背景像素的个数以及像素值的总和

                end

            end

        end

        %计算前景和背景的平均值

        z1=fnum/ifg;

        z2=bnum/ibg;

        if(T1==(uint8((z1+z2)/2)))

            b=0;

        else

            T1=uint8((z1+z2)/2);

        end

        %当阈值不变换时,退出迭代

end

disp(strcat('迭代的阈值T2:',num2str(T1)));

I1=im2bw(I,double(T1)/255);

imshow(I1)

3.编写基于质心型区域生长算法的图像分割程序,调节生长阈值和种子点坐标,观察实验结果。

I=imread('tire.tif');

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;

count=1; %待处理点个数

threshold=0.15;

while count>0

    count=0;

    for i=1:M %遍历整幅图像

    for j=1:N

        if J(i,j)==1 %点在“栈”内

        if (i-1)>1&(i+1)<M&(j-1)>1&(j+1)<N %3*3邻域在图像范围内

            for u=-1:1 %8-邻域生长

            for v=-1:1

                if J(i+u,j+v)==0&abs(I(i+u,j+v)-seed)<=threshold

                    J(i+u,j+v)=1;

                    count=count+1;  %记录此次新生长的点个数

                end

            end

            end

        end

        end

    end

    end

end

subplot(1,2,1),imshow(I);

title("原图像")

subplot(1,2,2),imshow(J);

title("分割后的图像")

1.鼠标选取轮胎轴中心点得到的图像:

2.鼠标选取轮胎任意一点得到的图像:

3.鼠标选取轮胎外一点得到的图像:

六、实验心得与体会

本次实验学习了图像分割,学习了用固定阈值分割、迭代法以及区域生长法几种不同的方法实现。同时体会到不同的分割方法出来的效果不同应用领域也不同。

迭代法:对于初始阈值T的选择要稍微注意些。当目标与背景的面积相当时,可以将初始阈值T设置为整个图像的平均灰度值;当目标与背景的面积相差较大时,更好地选择是将初始阈值T设置为最大灰度值和最小灰度值的中间值。

区域生长法:1.对CT图像、MR图像以及所有的具有边界效应,或者是该区域与外界区域有明显差距的图像,分割效果很好。

2.对感兴趣区域与外接区域存在边缘连通现象的图像,分割效果很差。如超声图像,肝脏对超声的反应就是“均匀性”散点回声。这造成“基于邻域像素相似性”分割很难应用。阈值设置的小,造成分割不完整;阈值设置得太大,造成过分割现象。

猜你喜欢

转载自blog.csdn.net/tutouxiaotu/article/details/127058565