資源簡(jiǎn)介
代碼用matlab編寫的,三個(gè)閾值分割的示例,本算法用的是最大內(nèi)間方差算法改造而成的
代碼片段和文件信息
%-----------------------------基于最大內(nèi)間方差思想的多閾值圖像分割算法-------------------------
tic
clc
clear?all;
close?all;
img?=?imread(‘lenna.bmp‘);
I_gray=rgb2gray(img);%將三原色彩色圖像轉(zhuǎn)化為灰度圖像
I_double=double(I_gray);????%轉(zhuǎn)化為雙精度,因?yàn)榇蠖鄶?shù)的函數(shù)和操作都是基于double的
[widlen]=size(I_gray);?????%wid為行數(shù),len為列數(shù)b
colorlevel=256;?????%灰度級(jí)
hist=zeros(colorlevel1);???%直方圖,256×1的0矩陣
threshold_num=3;%代表有三個(gè)閾值
threshould_vector=zeros(threshold_num1);%初始化一個(gè)向量數(shù)組用于存儲(chǔ)閾值
W=zeros(threshold_num+11);%用于存儲(chǔ)每個(gè)部分的w的值
miu=zeros(threshold_num+11);%用于存儲(chǔ)閾值分割出來(lái)的圖像各處的平均值
best_threshold=zeros(1threshold_num);%用于保存最好的閾值
%?file_ceache?=?fopen(‘test.txt‘‘w‘);%用于存儲(chǔ)命令行輸出的數(shù)據(jù)
%計(jì)算直方圖,統(tǒng)計(jì)灰度值的個(gè)數(shù)
for?i=1:wid
????for?j=1:len
????????m=I_gray(ij)+1;????%因?yàn)榛叶葹?-255所以+1
????????hist(m)=hist(m)+1;
????end
end
%直方圖歸一化
hist=hist/(wid*len);
%miuT為總的平均灰度,hist[m]代表像素值為m的點(diǎn)個(gè)數(shù)
miuT=0;
for?m=1:colorlevel
????miuT=miuT+(m-1)*hist(m);
end
max_fangcha=0;??%初始方差大小
%---------------------程序的開始-----------------------------------
for?t1=1:colorlevel-2
????for?t2=t1+1:colorlevel-1
????????for?t3=t2+1:colorlevel
????????????miu=zeros(threshold_num+11);
????????????W=zeros(threshold_num+11);
????????????%計(jì)算第一個(gè)目標(biāo)所占的比例
????????????for?m=1:t1
????????????????W(1)=W(1)+hist(m);
????????????end
????????????%計(jì)算第二個(gè)目標(biāo)所占的比例
????????????for?m=t1+1:t2
????????????????W(2)=W(2)+hist(m);
????????????end
????????????%計(jì)算第三個(gè)目標(biāo)所占的比例
????????????for?m=t2+1:t3
????????????????W(3)=W(3)+hist(m);
????????????end
????????????%計(jì)算第四個(gè)目標(biāo)所占的比例
????????????W(4)=1-W(1)-W(2)-W(3);
????????????%?????????????fprintf(file_ceache‘%d---%d---%d目標(biāo)W的值:%f%f%f%f\n‘t1t2t3W(1)W(2)W(3)W(4));
????????????%計(jì)算目標(biāo)的平均灰度
????????????for?m=1:colorlevel
????????????????if(m<=t1)
????????????????????miu(1)=miu(1)+(m-1)*hist(m);
????????????????else?if(m>t1&&m<=t2)
????????????????????????miu(2)=miu(2)+(m-1)*hist(m);
????????????????????else?if(m>t2&&m<=t3)
????????????????????????????miu(3)=miu(3)+(m-1)*hist(m);
????????????????????????else
????????????????????????????miu(4)=miu(4)+(m-1)*hist(m);
????????????????????????end
????????????????????end
????????????????end
????????????end
????????????%????f
評(píng)論
共有 條評(píng)論