資源簡介
目前有很多閾值分割的程序,但是大部分需要自己手動設置閾值,這樣就導致分割精度不高,此程序可以自動求取最佳閾值,分割效果很好。

代碼片段和文件信息
J=imread(‘2.jpg‘);
I=rgb2gray(J)
subplot(131)imshow(I);
title(‘原始圖像‘)
%下面使用MATLAB函數計算閾值
level=graythresh(I);
%用大津法計算全局圖像I的閾值
BW=im2bw(Ilevel);
?%閾值分割
subplot(132)imshow(BW)
title(‘graythresh?計算閾值‘)
disp(strcat(‘graythresh計算灰度閾值:‘num2str(uint8(level*255))))
?%下面的MATLAB程序實現簡化計算值
iMax=max(max(I));
iMin=min(min(I));
?%計算最大和最小值
T=double(iMin:iMax);
iSize=size(I);
muxSize=iSize(1)*iSize(2);
for?i=1:length(T)
???????%從最小灰度值到最大值分別計算方差
???????TK=T(1i);
???????iForeground=0;
???????iBackground=0;
???????%定義前景和背景數
???????ForegroundSum=0;
???????BackgroundSum=0;
???????%定義前景和背景灰度總和
???????for?j=1:iSize(1)
????????????for?k=1:iSize(2)
????????????????tmpData=I(jk);
????????????????if(tmpData>=TK)
?????????????????%前景像素點的計算
?????????????????iForeground=iForeground+1;
?????????????????ForegroundSum=ForegroundSum+double(tmpData);
????????????????else
?????????????????????%背景像素點的計算
?????????????????????iBackground=iBackground+1;
?????????????????????BackgroundSum=BackgroundSum+double(tmpData);
?????????????????end
??????????????end
????????????end
????????????%計算前景和背景的比例和平均灰度值
????????????%這里存在一個0分母的情況導致告警解決方法很簡單但不影響結果請讀者改進
????????????w0=iForeground/muxSize;
????????????w1=iBackground/muxSize;
????????????u0=ForegroundSum/iForeground;
????????????u1=BackgroundSum/iBackground;
????????????T(2i)=w0*w1*(u0-u1)*(u0-u1);
????????????%第二行為計算的方差
?????end
oMax=max(T(2:));
%第二行方差的最大值略NaN
idx=find(T(2:)>=oMax);
%方差最大值所對應列號
T=uint8(T(1idx));
%從第一行取出灰度值作為閾值
disp(strcat(‘簡化大津法計算灰度閾值:‘num2str(T)))
BW=im2bw(Idouble(T)/255);
%閾值分割
subplot(133)imshow(BW)
title(‘簡化大津法計算閾值‘)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1872??2008-11-13?18:14??goodotsu.m
-----------?---------??----------?-----??----
?????????????????1872????????????????????1
- 上一篇:pn序列產生matlab程序
- 下一篇:算術編碼matlab
評論
共有 條評論