資源簡介
利用混合高斯模型對背景圖像進行多高斯分布學習,根據背景學習結果,利用貝葉斯理論對含有目標的圖像進行分割。
代碼片段和文件信息
clc;clear;close?all;
%逐幅打開圖像列表中的圖像,并計算其特征
[filenamefilepathfilterindex]?=?uigetfile(...
????{‘*.txt‘‘All?Image?Files(*.txt)‘;
????‘*.mat‘‘mat-files(*.mat)‘;...
????
????‘*.*‘‘All?Image?Files(*.*)‘}...
????‘文件名列表‘‘untitled.mat‘...
????‘multiselect‘‘off‘);
if?isequal(filename0)||isequal(filepath0)
????return;
else
???filefullpath?=?fullfile(filepathfilename);
end
fid?=?fopen(filefullpath‘r‘);
ffnum?=?fscanf(fid‘%d‘);
fwnum?=?ffnum(1);
fonum?=?ffnum(2);
fprintf(1‘\nwaterNum=%d????otherNum=%d\n‘fwnumfonum);
fnum?=?fwnum?+?fonum;
fpath?=?fgetl(fid);
fprintf(1‘\n%s\n‘fpath);
nxyA?=?zeros(fwnum1);
cmA?=?zeros(33fwnum);
mvA?=?zeros(3fwnum);??
pixelnum?=?0;
%?learn_zoom?=?1/5;
%?test_zoom?=?1/5;
%B6?pics
%?learn_zoom?=?1/10;
%?test_zoom?=?1/10;
learn_zoom_size?=?100;
test_zoom_size?=?200;
for?k?=?1:fwnum
????fName?=?fgetl(fid);?
????ffName?=?fullfile(fpathfName);
????fprintf(1‘\n%s\n‘ffName);
????img?=?imread(ffName);?????%讀取圖像
????[imximyimd]?=?size(img);
????max_xy?=?max(imximy);
????if?max_xy>learn_zoom_size
????????learn_zoom?=?learn_zoom_size/max_xy;
????????img?=?zoomImg(imglearn_zoom);
????end
????simg?=?double(img);????%轉換數據格式
????Rd?=?simg(::1);
????Gd?=?simg(::2);
????Bd?=?simg(::3);
????[nx?ny]?=?size(Rd);?????%圖像的行、列數
????nxy?=?nx?*?ny;???????????%圖像的總象素數
????fprintf(1‘\n第%d測試圖像的行數:%d???列數:%d???像素數:%d\n‘knxnynxy);
%?????subplot(221);??imshow(img);title(‘background?RGB‘);
????nxyA(k)?=?nxy;
????nxA(k)?=?nx;
????nyA(k)?=?ny;
????pixels?=?reshape(simgnxy3);
????pixelsA(pixelnum+1:pixelnum+nxy:)?=?pixels;??
????pixelnum?=?pixelnum+nxy;
end
figure(1);
subplot(221);imshow(img);title(‘background‘);grid?on;
x?=?pixelsA;
nbVar?=?size(x2);
nn?=?1000;
c?=?1;
pixelsI?=?pixelsA(1:nn:);
Mu(1:)?=?sum(pixelsI)/nn;
Sigma(::1)?=?cov([pixelsI‘?pixelsI‘]‘);
Priors(1)?=?1;
%?[Data_id?Priors?Mu?Sigma]?=?EM_init_FCM(pixelsI?c);
%?[Priors?Mu?Sigma]?=?EM(pixelsI?Priors?Mu?Sigma);
t?=?zeros(pixelnum1);
t(1:nn)?=?1;
beta?=?1;
lamda?=?3;
for?j=1:pixelnum
????for?k=1:c
????????covt?=?reshape(Sigma(::k)nbVarnbVar);
????????incov?=?inv(covt);
????????dcov?=?det(covt);
????????logd?=?log(abs(dcov));
????????logp?=?log(Priors(k));
????????T(k)?=?beta*nbVar*lamda^2-2*logp+logd;
????????a?=?x(j:)-Mu(k:);
????????tt?=?a*incov*a‘-2*logp+logd;
????????if?tt>T(k)
????????????t_3std(jk)?=?-1;
????????????N_ab(jk)?=?-10^10;
????????else
????????????t_3std(jk)?=?1;
????????????N_ab(jk)?=?-(0.5)*a*incov*a‘+logp+(-0.5)*logd;%后驗概率值????????????????????????
????????end?
????end????????
????%判斷第j個樣本是哪一類:新的類別或已知類別中的一類
????[ir?ic]?=?find(t_3std(j:)==1);
????lnstd?=?length(ir);?
????%若在所有類別的3sigma之外,則為新的類別;若在3sigma之內,則判定為后驗概率最大的那一類
????if?lnstd==0
????????????c?=?c+1;
????????????t(j)?=?c;
????????????if?j ????????????????t(j+1:j+10)?=?c;
????????????end
????else
????????N_ab_max?=?max(
評論
共有 條評論