資源簡介
多閾值分割,圖像處理,最大內間方差算法otsu的,本程序用的是三個閾值的分割,matlab編寫的

代碼片段和文件信息
%-----------------------------基于最大內間方差思想的多閾值圖像分割算法-------------------------
tic
clc
clear?all;
close?all;
img?=?imread(‘lenna.bmp‘);
I_gray=rgb2gray(img);%將三原色彩色圖像轉化為灰度圖像
I_double=double(I_gray);????%轉化為雙精度,因為大多數的函數和操作都是基于double的
[widlen]=size(I_gray);?????%wid為行數,len為列數b
colorlevel=256;?????%灰度級
hist=zeros(colorlevel1);???%直方圖,256×1的0矩陣
threshold_num=3;%代表有三個閾值
threshould_vector=zeros(threshold_num1);%初始化一個向量數組用于存儲閾值
W=zeros(threshold_num+11);%用于存儲每個部分的w的值
miu=zeros(threshold_num+11);%用于存儲閾值分割出來的圖像各處的平均值
best_threshold=zeros(1threshold_num);%用于保存最好的閾值
%?file_ceache?=?fopen(‘test.txt‘‘w‘);%用于存儲命令行輸出的數據
%計算直方圖,統計灰度值的個數
for?i=1:wid
????for?j=1:len
????????m=I_gray(ij)+1;????%因為灰度為0-255所以+1
????????hist(m)=hist(m)+1;
????end
end
%直方圖歸一化
hist=hist/(wid*len);
%miuT為總的平均灰度,hist[m]代表像素值為m的點個數
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);
????????????%計算第一個目標所占的比例
????????????for?m=1:t1
????????????????W(1)=W(1)+hist(m);
????????????end
????????????%計算第二個目標所占的比例
????????????for?m=t1+1:t2
????????????????W(2)=W(2)+hist(m);
????????????end
????????????%計算第三個目標所占的比例
????????????for?m=t2+1:t3
????????????????W(3)=W(3)+hist(m);
????????????end
????????????%計算第四個目標所占的比例
????????????W(4)=1-W(1)-W(2)-W(3);
????????????%?????????????fprintf(file_ceache‘%d---%d---%d目標W的值:%f%f%f%f\n‘t1t2t3W(1)W(2)W(3)W(4));
????????????%計算目標的平均灰度
????????????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
????????????%????fprintf(file_ceache‘%d---%d---%d中的miu的值:%f%f%f%f\n‘t1t2t3miu(1)miu(2)miu(3)miu(4));
????????????%????????????fclose(file_ceache);
????????????%修改miu的值
????????????for?m=1:threshold_num+1
????????????????%由于不可避免會出現0的值,故采用下面方案處理
????????????????if?W(m)==0
????????????????????W(m)=0;
????????????????????miu(m)=0;
????????????????else
????????????????????miu(m)=miu(m)/W(m);
????????????????end
????????????end
????????????%?fprintf(‘%d---%d---%d中的miu的值:%f%f%f%f\n‘t1t2t3miu(1)miu(2)miu(3)miu(4));
????????????%????miu=miu./W;
????????????%計算方差
????????????fangcha(t1t2t3)=0;
????????????for?i=1:threshold_num+1
????????????????fangcha(t1t2t3)=fangcha(t1t2t3)+W(i)*((miu(i)-miuT).^2);
????????????end
????????????if(fangcha(t1t2t3)>max_fangcha)
????????????????max_fangcha=fangcha(t1
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????786486??2009-11-03?15:15??閾值分割\lenna.bmp
?????文件???????4704??2018-03-08?11:56??閾值分割\multi_Otsu.m
?????目錄??????????0??2018-03-16?11:22??閾值分割
-----------?---------??----------?-----??----
???????????????791190????????????????????3
- 上一篇:多閾值算法分割算法
- 下一篇:matlab萬年歷制作
評論
共有 條評論