最大类间方差法:基本思路是根据直方图以某一会灰度为阈值将图像分割成两部分,计算两组的方差,当被分成的两组之间的方差最大时,这个灰度为阈值灰度值
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;
 

 K-means均值效果图

 

 

 详情请参考:《现代数字图像处理技术提高及应用案例详解》赵小川著

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信