基于MATLAB的几种图像分割算法
生活随笔
收集整理的這篇文章主要介紹了
基于MATLAB的几种图像分割算法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
最大類間方差法:基本思路是根據(jù)直方圖以某一會(huì)灰度為閾值將圖像分割成兩部分,計(jì)算兩組的方差,當(dāng)被分成的兩組之間的方差最大時(shí),這個(gè)灰度為閾值灰度值
img = imread('C:\Users\dell\Desktop\前單圖\3.3.JPG');%原圖I_gray=rgb2gray(img);%轉(zhuǎn)換為灰度圖subplot(121),imshow(img); %轉(zhuǎn)換為雙精度 I_double=double(I_gray); [wid,len]=size(I_gray);%圖像的大小 %灰度級(jí) colorLevel=256; %直方圖 hist=zeros(colorLevel,1); %計(jì)算直方圖 for i=1:widfor j=1:lenm=I_gray(i,j)+1;%圖像的灰度級(jí)mhist(m)=hist(m)+1;%灰度值為i的像素和end end %直方圖歸一化 hist=hist/(wid*len);%各灰度值概率 Pi miuT=0;%定義總體均值 for m=1:colorLevelmiuT=miuT+(m-1)*hist(m); %總體均值 end xigmaB2=0;% for mindex=1:colorLevelthreshold=mindex-1;%設(shè)定閾值omega1=0;%目標(biāo)概率omega2=0;%背景概率for m=1:threshold-1omega1=omega1+hist(m);% 目標(biāo)概率 W0endomega2=1-omega1; %背景的概率 W1miu1=0;%目標(biāo)的平均灰度值miu2=0;%背景的平均灰度值for m=1:colorLevelif m<thresholdmiu1=miu1+(m-1)*hist(m);%目標(biāo) i*pi的累加值[1 threshold]elsemiu2=miu2+(m-1)*hist(m);%背景 i*pi的累加值[threshold m]endendmiu1=miu1/omega1;%目標(biāo)的平均灰度值miu2=miu2/omega2;%背景的平均灰度值xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;%最大方差xigma(mindex)=xigmaB21;%先設(shè)定一個(gè)值 再遍歷所有灰度級(jí)%找到xigmaB21的值最大if xigmaB21>xigmaB2finalT=threshold;%找到閾值 灰度級(jí)xigmaB2=xigmaB21;%方差為最大end end %閾值歸一化 fT=finalT/255; for i=1:widfor j=1:lenif I_double(i,j)>finalT %大于所設(shè)定的均值 則為目標(biāo)bin(i,j)=0;elsebin(i,j)=1;endend end subplot(122),imshow(bin);?
?
局部閾值算法:?主要應(yīng)用于圖像中有陰影,光照不均勻,各處的對(duì)比度不同,有突出噪聲,背景灰度突變等?
function bw=adaptivethreshold(IM,ws,C,tm) % 功能:自適應(yīng)圖像分割 % IM-待分割的原始圖像 ws平均濾波時(shí)的窗口大小 %C 常量 根據(jù)經(jīng)驗(yàn)選擇合適的參數(shù) % tm -開關(guān)變量 1=中值濾波 0=均值濾波 %bw- 圖像分割后的二值圖像 %輸入?yún)?shù)處理 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'); endIM=mat2gray(IM);if tm==0%圖像均值濾波mIM=imfilter(IM,fspecial('average',ws),'replicate');else%圖像進(jìn)行中值濾波mIM=medfilt2(IM,[ws,ws]);endsIM=mIM-IM-C;bw=im2bw(sIM,0);bw=imcomplement(bw);?
?K-means均值法:是一種廣泛的聚類方法
function [mu,mask]=kmeans(ima,k) %功能·:運(yùn)用K-means算法對(duì)圖像進(jìn)行分割 % 輸入 ima-輸入的灰度圖像 K-分類數(shù) %輸出 mu -均值類向量 mask-分類后的圖像 ima=double(ima); copy=ima; ima=ima(:); mi=min(ima);%找到最小值 ima=ima-mi+1; s=length(ima);%有多少灰度級(jí) %計(jì)算圖像灰度直方圖 m=max(ima)+1;%圖像最大灰度值 h=zeros(1,m); hc=zeros(1,m); for i=1:sif (ima(i)>0)h(ima(i))=h(ima(i))+1;%灰度值i累加endend ind =find(h); h1=length(ind); %初始化質(zhì)心 mu=(1:k)*m/(k+1); %start process while(true)oldmu=mu;%現(xiàn)有的分類·for i=1:h1c=abs(ind(i)-mu);cc=find(c==min(c));hc(ind(i))=cc(1);end%重新計(jì)算均值for i=1:ka=find(hc==i)mu(i)=sum(a.*h(a))/sum(h(a));endif(mu==oldmu) break;end end%計(jì)算生成分類后的圖像 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均值效果圖
?
?
?詳情請(qǐng)參考:《現(xiàn)代數(shù)字圖像處理技術(shù)提高及應(yīng)用案例詳解》趙小川著
總結(jié)
以上是生活随笔為你收集整理的基于MATLAB的几种图像分割算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微型计算机点火系统的摘要,丰田汽车点火系
- 下一篇: 世界第一台通用计算机:ENIAC