基于MATLAB的几种图像分割算法
转载自:https://blog.csdn.net/bentleydelll/article/details/82456150
最大类间方差法
基本思路是根据直方图以某一会灰度为阈值将图像分割成两部分,计算两组的方差,当被分成的两组之间的方差最大时,这个灰度为阈值灰度值
img = imread('C:\Users\dell\Desktop\前单图\3.3.JPG');%原图
I_gray=rgb2gray(img);%转换为灰度图
subplot(121),imshow(img);
%转换为双精度
I_double=double(I_gray);
[wid,len]=size(I_gray);%图像的大小
%灰度级
colorLevel=256;
%直方图
hist=zeros(colorLevel,1);
%计算直方图
for i=1:wid
for j=1:len
m=I_gray(i,j)+1;%图像的灰度级m
hist(m)=hist(m)+1;%灰度值为i的像素和
end
end
%直方图归一化
hist=hist/(wid*len);%各灰度值概率 Pi
miuT=0;%定义总体均值
for m=1:colorLevel
miuT=miuT+(m-1)*hist(m); %总体均值
end
xigmaB2=0;%
for mindex=1:colorLevel
threshold=mindex-1;%设定阈值
omega1=0;%目标概率
omega2=0;%背景概率
for m=1:threshold-1
omega1=omega1+hist(m);% 目标概率 W0
end
omega2=1-omega1; %背景的概率 W1
miu1=0;%目标的平均灰度值
miu2=0;%背景的平均灰度值
for m=1:colorLevel
if m<threshold
miu1=miu1+(m-1)*hist(m);%目标 i*pi的累加值[1 threshold]
else
miu2=miu2+(m-1)*hist(m);%背景 i*pi的累加值[threshold m]
end
end
miu1=miu1/omega1;%目标的平均灰度值
miu2=miu2/omega2;%背景的平均灰度值
xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;%最大方差
xigma(mindex)=xigmaB21;%先设定一个值 再遍历所有灰度级
%找到xigmaB21的值最大
if xigmaB21>xigmaB2
finalT=threshold;%找到阈值 灰度级
xigmaB2=xigmaB21;%方差为最大
end
end
%阈值归一化
fT=finalT/255;
for i=1:wid
for j=1:len
if I_double(i,j)>finalT %大于所设定的均值 则为目标
bin(i,j)=0;
else
bin(i,j)=1;
end
end
end
subplot(122),imshow(bin);
局部阈值算法
主要应用于图像中有阴影,光照不均匀,各处的对比度不同,有突出噪声,背景灰度突变等
function bw=adaptivethreshold(IM,ws,C,tm)
% 功能:自适应图像分割
% IM-待分割的原始图像 ws平均滤波时的窗口大小
%C 常量 根据经验选择合适的参数
% tm -开关变量 1=中值滤波 0=均值滤波
%bw- 图像分割后的二值图像
%输入参数处理
if (nargin<3)
error('You must provide the image IM, the window size ws, and C');
elseif(nargin==3)
tm=0;
elseif(tm~=0&&tm~=1)
error('tm must be 0 or 1');
end
IM=mat2gray(IM);
if tm==0
%图像均值滤波
mIM=imfilter(IM,fspecial('average',ws),'replicate');
else
%图像进行中值滤波
mIM=medfilt2(IM,[ws,ws]);
end
sIM=mIM-IM-C;
bw=im2bw(sIM,0);
bw=imcomplement(bw);
K-means均值法
是一种广泛的聚类方法
function [mu,mask]=kmeans(ima,k)
%功能·:运用K-means算法对图像进行分割
% 输入 ima-输入的灰度图像 K-分类数
%输出 mu -均值类向量 mask-分类后的图像
ima=double(ima);
copy=ima;
ima=ima(:);
mi=min(ima);%找到最小值
ima=ima-mi+1;
s=length(ima);%有多少灰度级
%计算图像灰度直方图
m=max(ima)+1;%图像最大灰度值
h=zeros(1,m);
hc=zeros(1,m);
for i=1:s
if (ima(i)>0)
h(ima(i))=h(ima(i))+1;%灰度值i累加
end
end
ind =find(h);
h1=length(ind);
%初始化质心
mu=(1:k)*m/(k+1);
%start process
while(true)
oldmu=mu;
%现有的分类·
for i=1:h1
c=abs(ind(i)-mu);
cc=find(c==min(c));
hc(ind(i))=cc(1);
end
%重新计算均值
for i=1:k
a=find(hc==i)
mu(i)=sum(a.*h(a))/sum(h(a));
end
if(mu==oldmu)
break;
end
end
%计算生成分类后的图像
s=size(copy);
mask=zeros(s);
for i=1:s(1)
for j=1:s(2)
c=abs(copy(i,j)-mu);
a=find(c==min(c));
mask(i,j)=a(1);
end
end
mu=mu+mi-1;
详情请参考:《现代数字图像处理技术提高及应用案例详解》赵小川著