【数字图像处理】实验(5)——图像分割与描述(MATLAB实现)

链接: 【数字图像处理】实验(1)——图像基本变换
链接: 【数字图像处理】实验(2)——图像增强(MATLAB实现)
链接: 【数字图像处理】实验(3)——图像综合应用:皮肤美化(MATLAB实现)
链接: 【数字图像处理】实验(4)——图像复原及几何校正 (MATLAB实现)

一、实验目的

(1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。
(2)掌握图像分割方法,熟悉常用图像描述方法。

二、实验内容

1.打开一幅图像Image,使用Matlab图像处理函数,对其进行下列变换:
(1)将Image灰度化为gray,对其进行阈值分割转换为BW;
(2)对BW进行数学形态学滤波;
(3)对BW进行边缘跟踪,用红色线在图中标出;
(4)计算各区域边界点的傅里叶描绘子并用四分之一点重建边界;
(5)实验要求中的拓展内容。
2.拓展内容
(1)尝试不同的阈值选择方法,实现灰度图像二值化;
(2)变换参数实现形态学滤波,查看滤波效果;
(3)更改重建边界点数,查看效果;
(4)自行设计方法实现图像分割,并计算分割区域相关参数。

三、实验原理

1.灰度线性变换就是将图像中所有点的灰度按照线性灰度变换函数进行变换。
2.直方图均衡化通过点运算将输入图像转换为在每一级上都有相等像素点数的输出图像。
3.在实际的成像系统中,图像捕捉介质平面和物体平面之间不可避免地存在有一定的转角和倾斜角。
转角对图像的影响是产生图像旋转,倾斜角的影响表现为图像发生投影变形。另外一种情况是由于摄像机系统本身的原因导致的镜头畸变。此外,还有由于物体本身平面不平整导致的曲面畸变如柱形畸变等。这些畸变统称为几何畸变。
4.图像插值是一种基本的图像处理方法,它可以为数字图像增加或减少像素的数目。当图像被放大时,像素会相应地增加,该像素增加的过程实际就是插值程序自动选择信息较好的像素作为新的像素以弥补空白像素空间的过程。虽然经过插值后图像可以变得更平滑、干净,但由于新增加的像素也仅仅只是原始像素的某种组合而已,所以图像的插值运算并不会增加新的图像信息。
插值图像提供坐标–>计算该坐标在原始图像中的对应坐标–>原始图像返回像素值并进行插值运算双线性插值法充分利用了邻域像素的不同占比程度而计算得出最合适的插值像素,从而完成插值。相比较于最近邻插值,双线性插值的插值效果要好得多,因为最近邻插值只跟(x,y)最近的像素值有关,而双线性插值是按照(x,y)上下、左右四个像素值的重要程度进行插值的(即越接近越重要)。
5.维纳(wiener)滤波 可以归于反卷积(或反转滤波)算法一类,它是由Wiener首提出的,并应用于一维信号,并取得很好的效果。以后算法又被引入二维信号理,也取得相当满意的效果,尤其在图象复原领域,由于维纳滤波器的复原效良好,计算量较低,并且抗噪性能优良,因而在图象复原领域得到了广泛的应用并不断得到改进发展,许多高效的复原算法都是以此为基础形成的。
6.图像分割是指把一副图像分成不同的具有特定性质区域的图像处理技术,将这些区域提取出来以便进一步提取特征,是由图像处理到图像分析的关键步骤。图像分割由于其重要性一直是图像处领域的研究重点。其中阈值分割方法是根据图像灰度值的分布特性确定某个阈值来进行图像分割的一种方法。设原灰度图像为 f (x, y) ,通过某种准则选择一个灰度值T 作为阈值,比较各像素值与T 的大小关系:像素值大于等于T 的像素为一类,变更像素值为 1;像素值小于T 的像素点为另一类,变更其像素值为 0。

四、Matlab相关函数介绍

(1)im2bw函数
BW = im2bw(I, level):以level为阈值把灰度图像I转变为二值图像。
(2)graythresh函数
level = graythresh(I),使用Otsu方法获取阈值,level被归一化到[0,1]区间。
(3)imbinarize函数
BW = imbinarize(I):采用基于OTSU方法的全局阈值实现灰度图像I的二值化。
BW = imbinarize(I, METHOD) :采用METHOD指定的方法获取阈值实现灰度图像I的二值化。METHOD可选’global’和’adaptive’,前者指定OTSU方法,后者采用局部自适应阈值方法。
(4)bwboundaries函数
搜索二值图像BW的外边界和内边界。
[B,L,N,A] = bwboundaries(BW,CONN,OPTIONS) :函数视BW中为0的元素为背景像素点,为1的元素为待提取边界目标。B中的每个元素均为Q×2矩阵,矩阵中每一行包含边界像素点的行坐标和列坐标,Q为边界所含像素点的个数。L,标识矩阵,标识二值图像中被边界所划分的区域;N,区域的数目N;A,被划分的区域的邻接关系。CONN取4,搜索中采用4连通方法,默认取8,即8连通方法。OPTIONS指定算法的搜索方式,默认为‘holes’,搜索目标的内外边界,‘noholes’只搜索目标的外边界。
(5)bwtraceboundary函数
跟踪二值图像BW中目标轮廓。
B = bwtraceboundary(BW,P,FSTEP):目标区域取值非0;参数P是初始跟踪点的行列坐标二元矢量;FSTEP表示初始查找方向,用于寻找对象中与P相连的下一个像素,可取’N’、‘NE’、‘E’、‘SE’、‘S’、‘SW’、‘W’、‘NW’;返回值B为边界坐标值,是一个Q×2矩阵。
(6)strel函数
创建形态学结构元素。
SE = strel(shape,parameters),创建一个由shape指定的结构元素,其中shape的种类有:arbitrary、pair、diamond、periodicline、disk、rectangle、line、square、octagon,参数parameters一般控制SE的大小。
(7)imdilate函数
IM2 = imdilate(IM, SE):膨胀图像IM,返回膨胀后的图像IM2,SE是结构元素。
(8)imerode函数
IM2 = imerode(IM,SE):腐蚀图像IM,返回腐蚀后的图像IM2,SE是结构元素。
(9)imopen函数
IM2 = imopen(IM,SE):对图像IM进行开运算,返回图像为IM2,SE是结构元素。
(10)imclose函数
IM2 = imclose(IM,SE):对图像IM进行闭运算,返回图像为IM2,SE是结构元素。
(11)fft和fft2函数
fft(X):对序列X进行DFT运算。
fft2(X):对矩阵X进行二维DFT运算。
(12)ifft和ifft2函数
ifft(X):对X进行IDFT运算。
ifft2(F):对F进行二维IDFT运算。

五、实验代码及结果(包括分析、代码和波形)

(1)将Image灰度化为gray,对其进行阈值分割转换为BW;

代码:

%1.将Image灰度化为gray,对其进行阈值分割转换为BW
clear,clc,close all;
Image1=im2double(imread('lotus1.bmp'));
%1.1将Image灰度化为gray
gray=rgb2gray(Image1);
T=graythresh(gray);           %使用 Otsu 方法获取阈值,T 被归一化到[0,1]区间。
figure;
subplot(121),imshow(Image1),title('原图');             
subplot(122),imshow(gray),title('原图:灰度图像');

%1.2进行阈值分割转换为BW
BW=im2bw(gray,T);             %以 T 为阈值把灰度图像 I 转变为二值图像。
figure,imshow(BW),title('1.BW二值化图像');

结果:
在这里插入图片描述

(2)对BW进行数学形态学滤波;

代码:

%1.将Image灰度化为gray,对其进行阈值分割转换为BW
clear,clc,close all;
Image1=im2double(imread('lotus1.bmp'));
%1.1将Image灰度化为gray
gray=rgb2gray(Image1);
T=graythresh(gray);           %使用 Otsu 方法获取阈值,T 被归一化到[0,1]区间。
figure;
subplot(121),imshow(Image1),title('原图');             
subplot(122),imshow(gray),title('原图:灰度图像');

%1.2进行阈值分割转换为BW
BW=im2bw(gray,T);             %以 T 为阈值把灰度图像 I 转变为二值图像。
figure,imshow(BW),title('1.BW二值化图像');

%2.对BW进行数学形态学滤波
SE=strel('square',3);         %创建一个由square指定的结构元素,参数3控制 SE 的大小。
Morph=imopen(BW,SE);          %对图像BW进行开运算,返回图像为Morph,SE是结构元素
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('2.形态学滤波');

结果:
在这里插入图片描述

(3)对BW进行边缘跟踪,用红色线在图中标出;

代码:

%1.将Image灰度化为gray,对其进行阈值分割转换为BW
clear,clc,close all;
Image1=im2double(imread('lotus1.bmp'));
%1.1将Image灰度化为gray
gray=rgb2gray(Image1);
T=graythresh(gray);           %使用 Otsu 方法获取阈值,T 被归一化到[0,1]区间。
figure;
subplot(121),imshow(Image1),title('原图');             
subplot(122),imshow(gray),title('原图:灰度图像');

%1.2进行阈值分割转换为BW
BW=im2bw(gray,T);             %以 T 为阈值把灰度图像 I 转变为二值图像。
figure,imshow(BW),title('1.BW二值化图像');

%2.对BW进行数学形态学滤波
SE=strel('square',3);         %创建一个由square指定的结构元素,参数3控制 SE 的大小。
Morph=imopen(BW,SE);          %对图像BW进行开运算,返回图像为Morph,SE是结构元素
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('2.形态学滤波');

%3.对BW进行边缘跟踪,用红色线在图中标出
[B L]=bwboundaries(1-Morph);  %搜索二值图像BW的外边界和内边界
figure,imshow(L),title('3.边缘跟踪:划分的区域');

(4)计算各区域边界点的傅里叶描绘子并用四分之一点重建边界;

代码:

%1.将Image灰度化为gray,对其进行阈值分割转换为BW
clear,clc,close all;
Image1=im2double(imread('lotus1.bmp'));
%1.1将Image灰度化为gray
gray=rgb2gray(Image1);
T=graythresh(gray);           %使用 Otsu 方法获取阈值,T 被归一化到[0,1]区间。
figure;
subplot(121),imshow(Image1),title('原图');             
subplot(122),imshow(gray),title('原图:灰度图像');

%1.2进行阈值分割转换为BW
BW=im2bw(gray,T);             %以 T 为阈值把灰度图像 I 转变为二值图像。
figure,imshow(BW),title('1.BW二值化图像');

%2.对BW进行数学形态学滤波
SE=strel('square',3);         %创建一个由square指定的结构元素,参数3控制 SE 的大小。
Morph=imopen(BW,SE);          %对图像BW进行开运算,返回图像为Morph,SE是结构元素
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('2.形态学滤波');

%3.对BW进行边缘跟踪,用红色线在图中标出
[B L]=bwboundaries(1-Morph);  %搜索二值图像BW的外边界和内边界
figure,imshow(L),title('3.边缘跟踪:划分的区域');

%4.傅里叶描绘子计算及重建。
hold on;
for i=1:length(B)
    boundary=B{i};
    plot(boundary(:,2),boundary(:,1),'r','LineWidth',2);
end
 
M=zeros(length(B));                        
for k=1:length(B)                            
    N=length(B{k});                          
    if N/2~=round(N/2)                       
        B{k}(end+1,:)=B{k}(end,:);             
        N=N+1;
    end
    M(k)=[N*3/4];      
end
S=zeros(size(Morph));                           
figure,imshow(S),title('4.傅里叶描绘子计算及重建');
hold on;
for k=1:length(B) 
    z=B{k}(:,2)+1i*B{k}(:,1); 
    Z=fft(z);                            
    [Y I]=sort(abs(Z));                    
    for count=1:M(k)                    
        Z(I(count))=0;                   
    end
    zz=ifft(Z);                           
    plot(real(zz),imag(zz),'w');              
end

结果:
在这里插入图片描述

(5)拓展内容:

分析:
在这里插入图片描述

边界跟踪是指根据某些严格的“探测准则”找出目标物体轮廓上的像素,即确定边界的起始搜索点。在根据一定的“跟踪准则”找出目标物体上的其他像素,直到符合跟踪终止条件。

边界描述是指用相关方法和数据来表示区域边界。边界描述中既含有几何信息,也含有丰富的形状信息,是一种很常见的图像目标描述方法。傅里叶描绘子的方法主要利用DFT描绘子重建区域边界曲线。由于傅里叶的高频分量对应于一些细节部分,而低频分量则对应基本形状,因此,重建时可以只使用复序列的前 M 各较大系数其余置零。

传统的分水岭分割算法,是一种基于拓扑理论的数学形态学的分割方法,传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法。传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆地,而集水盆地的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每-一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸人水中,随着浸入的加深,
极小值表面,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆地汇合处构筑大坝如下每一个局部极小值的影响域慢慢向外扩展,在两个集水盆地汇合处构筑大坝如下图所示,即形成分水岭。分水岭变换通过不同的水系排水来分离区域,达到图像图所示,即形成分水岭.分水岭变换通过不同的水系排水来分离区域,达到图像分割的目的。

(1)尝试不同的阈值选择方法,实现灰度图像二值化;

a. 人工选定阈值进行分割,选择阈值为150

代码:

%将Image灰度化为gray,对其进行阈值分割转换为BW
clear,clc,close all;
I=im2double(imread('lotus1.bmp'));
%将Image灰度化为gray
gray=rgb2gray(I);
T=graythresh(gray);           %使用 Otsu 方法获取阈值,T 被归一化到[0,1]区间。
figure;
subplot(121),imshow(I),title('原图');             
subplot(122),imshow(gray),title('原图:灰度图像');
%(1)灰度图像二值化
I=imread('lotus1.bmp');
%1.1人工选定阈值进行分割,选择阈值为150
[width,height]=size(I);
T1=150;
for i=1:width
    for j=1:height
        if(I(i,j)<T1)
            BW1(i,j)=0;
        else 
            BW1(i,j)=1;
        end
    end
end
BW2 = im2bw(BW1);
figure;imshow(BW2),title('人工阈值进行分割');

结果:
在这里插入图片描述
在这里插入图片描述

b. 基于灰度直方图的阈值选择

在这里插入图片描述

代码:

clear,clc,close all;
Image=rgb2gray(imread('lotus1.bmp'));
figure,
imshow(Image),title('原始图像');
imhist(Image);
hist1=imhist(Image);
hist2=hist1;
iter=0;
while 1
    [is,peak]=Bimodal(hist1);
    if is==0
        hist2(1)=(hist1(1)*2+hist1(2))/3;
        for j=2:255
            hist2(j)=(hist1(j-1)+hist1(j)+hist1(j+1))/3;
        end
        hist2(256)=(hist1(255)+hist1(256)*2)/3;
        hist1=hist2;
        iter=iter+1;
        if iter>1000
            break;
        end
    else
        break;
    end
end

[trough,pos]=min(hist1(peak(1):peak(2)));
thresh=pos+peak(1);
figure,stem(1:256,hist1,'Marker','none');
hold on
stem([thresh,thresh],[0,trough],'Linewidth',2);
hold off
result=zeros(size(Image));
result(Image>thresh)=1;
figure,imshow(result),title('基于双峰直方图的阈值化');
imwrite(result,'bilotus1.jpg');   

function [is,peak]=Bimodal(histgram)
    count=0;
    for j=2:255
        if histgram(j-1)<histgram(j) && histgram(j+1)<histgram(j)
            count=count+1;
            peak(count)=j;
            if count>2 
                is=0;
                return;
            end
        end
    end
    if count==2
        is=1;
    else
        is=0;
    end
end

结果:
灰度直方图和平滑后的直方图及波谷
在这里插入图片描述

在这里插入图片描述

c. OTSU方法分割图,阈值为700

在这里插入图片描述

代码:

Image=rgb2gray(imread('lotus1.bmp'));
figure,
subplot(121),imshow(Image),title('原始图像'); 
T=graythresh(Image);
result=im2bw(Image,T);
% imwrite(result,'lotus1otsu.jpg');            
subplot(122),imshow(result),title('OTSU方法二值化图像');

结果:
在这里插入图片描述

d. 最大熵法,选择阈值为120

在这里插入图片描述

代码:

clear,clc,close all;
Image=rgb2gray(imread('lotus1.bmp'));
figure,
subplot(121),imshow(Image),title('原始图像'); 
hist=imhist(Image);
bottom=min(Image(:))+1;
top=max(Image(:))+1;
J=zeros(256,1);
for t=bottom+1:top-1
    po=sum(hist(bottom:t));
    pb=sum(hist(t+1:top));
    ho=0;
    hb=0;
    for j=bottom:t
        ho=ho-log(hist(j)/po+0.01)*hist(j)/po;
    end
    for j=t+1:top
        hb=hb-log(hist(j)/pb+0.01)*hist(j)/pb;
    end
    J(t)=ho+hb;        
end
[maxJ,pos]=max(J(:));
result=zeros(size(Image));
result(Image>pos)=1;
%figure,imshow(result);
% imwrite(result,'lotus1shang.jpg');         
subplot(122),imshow(result),title('最大熵法分割图,T=120');

结果:
在这里插入图片描述

e. 最小误差法,阈值为111

在这里插入图片描述
在这里插入图片描述

代码:

clear,clc,close all;
Image=rgb2gray(imread('lotus1.bmp'));
figure,
subplot(121),imshow(Image),title('原始图像'); 
hist=imhist(Image);
bottom=min(Image(:))+1;
top=max(Image(:))+1; 
J=zeros(256,1);
J=J+100000;
alpha=0.25;
scope=find(hist>5);
minthresh=scope(1);
maxthresh=scope(end);
for t=minthresh+1:maxthresh-1
    miuo=0;
    sigmaho=0;
    for j=bottom:t
        miuo=miuo+hist(j)*double(j);
    end
    pixelnum=sum(hist(bottom:t));
    miuo=miuo/pixelnum;
    for j=bottom:t
        sigmaho=sigmaho+(double(j)-miuo)^2*hist(j);
    end
    sigmaho=sigmaho/pixelnum;
    
    miub=0;
    sigmahb=0;
    for j=t+1:top
        miub=miub+hist(j)*double(j);
    end
    pixelnum=sum(hist(t+1:top));
    miub=miub/pixelnum;
    for j=t+1:top
        sigmahb=sigmahb+(double(j)-miub)^2*hist(j);
    end
    sigmahb=sigmahb/pixelnum;
    
    Epsilonb=0;
    Epsilono=0;
    for j=bottom:t
        pb=exp(-(double(j)-miub)^2/(sigmahb*2+eps))/(sqrt(2*pi*sigmahb)+eps);
        Epsilonb=Epsilonb+pb;
    end
    for j=t+1:top        
        po=exp(-(double(j)-miuo)^2/(sigmaho*2+eps))/(sqrt(2*pi*sigmaho)+eps);
        Epsilono=Epsilono+po;
    end
    J(t)=alpha*Epsilono+(1-alpha)*Epsilonb;
end
[minJ,pos]=min(J(:));
result=zeros(size(Image));
result(Image>pos)=1;
%figure,imshow(result),title('最小误差阈值法');
% imwrite(result,'lotus1wucha.jpg');
subplot(122),imshow(result),title('最小误差阈值法,T=111');

结果:
在这里插入图片描述

f. 基于迭代运算,阈值为109.7

在这里插入图片描述
在这里插入图片描述

代码:

Image=im2double(rgb2gray(imread('lotus1.bmp')));
figure;
subplot(121),imshow(Image),title('灰度图像');
T=(max(Image(:))+min(Image(:)))/2;
equal=false;
while ~equal
    rb=find(Image>=T);
    ro=find(Image<T);
    NewT=(mean(Image(rb))+mean(Image(ro)))/2;
    equal=abs(NewT-T)<1/256;
    T=NewT;
end
result=im2bw(Image,T);
subplot(122),imshow(result),title('迭代方法,T=109.7');

结果:
在这里插入图片描述

g. 基于模糊理论,阈值为135

在这里插入图片描述
在这里插入图片描述

代码:

clear,clc,close all;
Image=rgb2gray(imread('lotus1.bmp'));
figure,
subplot(121),imshow(Image),title('原始图像'); 
hist=imhist(Image);
bottom=min(Image(:))+1;
top=max(Image(:))+1; 
C=double(top-bottom);
S=zeros(256,1);
J=10^10;
for t=bottom+1:top-1
    miuo=0;
    for j=bottom:t
        miuo=miuo+hist(j)*double(j);
    end
    pixelnum=sum(hist(bottom:t));
    miuo=miuo/pixelnum;
    for j=bottom:t
        miuf=1/(1+abs(double(j)-miuo)/C);
        S(j)=-miuf*log(miuf)-(1-miuf)*log(1-miuf);
    end
        
    miub=0;
    for j=t+1:top
        miub=miub+hist(j)*double(j);
    end
    pixelnum=sum(hist(t+1:top));
    miub=miub/pixelnum;
    for j=t+1:top
        miuf=1/(1+abs(double(j)-miub)/C);
        S(j)=-miuf*log(miuf)-(1-miuf)*log(1-miuf);
    end
    currentJ=sum(hist(bottom:top).*S(bottom:top));
    if currentJ<J
        J=currentJ;
        thresh=t;
    end           
end
result=zeros(size(Image));
result(Image>thresh)=1;
%figure,imshow(result);
%imwrite(result,'lotus1fuzzy.jpg');
subplot(122),imshow(result),title('模糊熵,T=135');        

结果:

在这里插入图片描述

(2)变换参数实现形态学滤波,查看滤波效果;

代码:

clear,clc,close all;
Image=im2double(rgb2gray(imread('lotus1.bmp')));
T=graythresh(Image);
BW=im2bw(Image,T);
figure;
subplot(121),imshow(BW),title('二值化图像');
SE=strel('disk',3);
Morph=imopen(BW,SE);
Morph=imclose(Morph,SE);
subplot(122),imshow(Morph),title('形态学滤波');

结果:
在这里插入图片描述

(3)更改重建边界点数,查看效果;

代码:

Image1=im2double(imread('lotus1.bmp')); 
gray=rgb2gray(Image1); 
T=graythresh(gray); 
BW=im2bw(gray,T); 
[B L]=bwboundaries(1-BW); 
figure,imshow(L),title('1.划分的区域'); 
hold on; 
for i=1:length(B) 
boundary=B{i}; 
plot(boundary(:,2),boundary(:,1),'r','LineWidth',1); 
end 
M=zeros(length(B),4); 
for k=1:length(B) 
N=length(B{k}); 
if N/2~=round(N/2) 
B{k}(end+1,:)=B{k}(end,:); 
N=N+1; 
end 
M(k,:)=[N/2 N*7/8 N*15/16 N*63/64]; 
%N/2,N/8,N/16,N/64项重建
end 
S=zeros(size(Morph)); 
for m = 1:4 
figure,imshow(S); 
hold on; 
for k=1:length(B) 
z=B{k}(:,2)+1i*B{k}(:,1);Z=fft(z); 
[Y I]=sort(abs(Z)); 
for count=1:M(k,m) 
Z(I(count))=0; 
end 
zz=ifft(Z); 
plot(real(zz),imag(zz),'w'); 
end 
end 

结果:
在这里插入图片描述
N/2,N/8,N/16,N/64项重建
在这里插入图片描述
在这里插入图片描述

(4)自行设计方法实现图像分割,并计算分割区域相关参数。

代码:

img=imread('lotus1.bmp');
subplot(2,3,1);
imshow(img),title('原图');
C = makecform('srgb2lab');       %设置转换格式
img_lab = applycform(img, C);
 
ab = double(img_lab(:,:,2:3));    %取出lab空间的a分量和b分量
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);
 
nColors = 3;        %分割的区域个数为3
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3);  %重复聚类3次
pixel_labels = reshape(cluster_idx,nrows,ncols);
subplot(2,3,2);
imshow(pixel_labels,[]), title('聚类结果');
 
 
%显示分割后的各个区域
segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);
 
for k = 1:nColors
    color = img;
    color(rgb_label ~= k) = 0;
    segmented_images{k} = color;
end
subplot(2,3,3);
imshow(segmented_images{1}), title('分割结果——区域1');
subplot(2,3,4);
imshow(segmented_images{2}), title('分割结果——区域2');
subplot(2,3,5);
imshow(segmented_images{3}), title('分割结果——区域3');

结果:
在这里插入图片描述

六、实验总结

1.阈值
1.1 阈值及二值化

图像二值化是图像处理的基本技术,而选取合适的分割阈值可以说是图像二值化的重要步骤。对于灰度图像,选择合适的一个或几个灰度值 t(0≤t≤255),将目标和背景分开,这个灰度值t称为阈值。如果只选择一个阈值,就称为图像的二值化。二值化又称为灰度分划,凡是需要做文字识别或条纹辨认的图像,皆可利用此方式。二值化的基本过程如下:①对原始图像作中低通滤波,进行图像的预处理,降低或去除噪声;②用算法确定最佳阈值;③凡是像素的灰度值大于这个阈值的设成255,小于这个阈值的设成0。这样处理后的图像就只有黑白两色,从而将灰度范围划分成目标和背景两类,实现了图像的二值化。

1.2 阈值选取算法的分类

一般地,针对图像像素的阈值选取方法可分为全局阈值算法和局部阈值算法两类。全局阈值算法是根据整幅图像选取一个固定的阈值将图像二值化。常用的全局阈值算法有大律法(最大类间方差法或Otsu法)等。全局阈值算法比较简单,实现比较容易,适用于图像的灰度直方图有明显的双峰,此时可选灰度直方图的谷底对应的灰度值作为最佳阈值。但当图像有噪声或光照不均匀时,图像的灰度直方图往往没有明显的双峰或有多个峰,此时该方法受到极大的限制,可采用局部阈值算法。局部阈值算法是将图像划分为若干子图像,结合当前考察的像素点和其邻域像素点的灰度值,确定考察点的阈值。常用的局部阈值法有Bernsen算法等。使用局部算法可以图像的二值化效果更好,抗噪声能力更强。

2常用的二值化算法

2.1 Otsu算法(最大类间方差法)

最大类间方差法是由Otsu于1979年提出的,是基于整幅图像的统计特性,实现阈值的自动选取的,是全局二值化最杰出的代表。Otsu算法的基本思想是用某一假定的灰度值将图像的灰度分成两组(或者叫两类),当两组的类间方差最大时,此灰度值就是图像二值化的最佳阈值。设图像有M个灰度值,取值范围在0~M-1,在此范围内选取灰度值t,将图像分成两组G■和G■,G■包含的像素的灰度值在0~t,G■的灰度值在t+1~M-1,用N表示图像像素总数,n■表示灰度值为i的像素的个数。

最佳阈值T就是使类间方差最大的t的取值,即T=arg maxσ(t)■,t∈[0,M-1]

Otsu算法可这样理解:阈值T将整幅图像分成前景和背景两部分,当两类的类间方差最大时,此时前景和背景的差别最大,二值化效果最好。

2.2 灰度拉伸法

当目标和背景对比不明显即灰度相差不大或图像有噪声时, Otsu算法的效果都不十分理想。为此,有人提出了灰度拉伸的增强的Otsu算法。灰度拉伸即用图像的原有灰度乘以一个大于1的系数,增加像素间灰度的差别,当系数为1时,即为Otsu算法。可以说Otsu算法是特殊的灰度拉伸法。实际使用时不同的图像可以乘以不同的系数,从而得到比较理想的效果。

2.3 与Otsu类似的算法

在Otsu的算法基础上,引入类内方差σ■■(t)=ω■μ■■ω■μ■■,求类间方差和类内方差的比值s(t)=σ■■(t)/σ■■(t),当s(t)最大时所得到的t就是最佳阈值。

2.4 Bernsen 算法

Bernsen 算法是一种典型的局部二值化算法,是一种动态选择阈值的自适应方法。设图像在像素点(x,y)处的灰度值为f(x,y),考虑以像素点(x,y)为中心的(2w+1)×(2w+1)窗口(2w+1是窗口的宽度),则Bersen算法可以描述如下:

(1)计算图像中各点(x,y)的阈值w(x,y)
(2)对图像中各像素点(x,y)用w(x,y)值逐点进行二值化

2.5 直方图方法

根据图像的直方图统计,找出双峰间的谷值,即最佳阈值。

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚神公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值