上面兩篇博客,解釋了概率有向圖(貝葉斯網),和用其解釋條件獨立。本篇將研究馬爾可夫隨機場(Markov random fields),也叫無向圖模型,或稱為馬爾科夫網(Markov network)
下面附上,上述實驗的matlab代碼。沒有插入matlab選項,大家復制到matlab里面看吧。下次我用python實現吧
% PRML image de-noising clc; clear; close all; A=imread('a.jpg');%讀入名字為a.jpg的圖片 imshow(A); M=400; N=300;%把圖片處理一下大小 A=imresize(A,[M,N]); X = rgb2gray(A); for i=1:M%%二值化圖像,要根據實驗圖像來改天閾值,本實驗閾值為200 for j=1:N if(X(i,j)<200)%200為閾值,請您根據實際實驗圖片改變 X(i,j)=0; else X(i,j)=255; end end end Y=X%把原圖X保存在Y里 imshow(X)%顯示X for i=1:M%這兩個for循環是改變二值化圖像10%點的值。 for j=1:N if(rand()<0.1)%以百分之10的概率進行改變 if(Y(i,j)==0) % Y(i,j)=250; Y(i,j)=255; else Y(i,j)=0; end end end end figure; imshow(Y);%顯示帶有噪聲的圖像 YY=zeros(M,N) for i=1:M%把{0,255}轉換為{-1,+1} for j=1:N if Y(i,j)==255 YY(i,j)=1; else YY(i,j)=-1; end end end %參數設置 beta=1.0; yita=2.1; h=0; %step1 R=YY; %R是要逼近X的圖像,YY是噪聲圖像 %step2 Change=1
while Change %系統掃描法,可以試試隨機選點法的效果 Change=0; for i=2:M-1
for j=2:N-1 temp=R(i,j); %若這個點狀態為+1,計算這一點的能量。 %解釋一下為什么是2*beta..因為這個點不僅影響自己的能量函數,也影響了周圍四個點的能量函數。 %所以-2*beta=-beat*(..)-beat*(...).第一項相當於它自己的能量函數,第二項相當於周圍能量函數的一部分。 %R(i,j)不會對其他點的能量造成影響,所以只考慮(i,j)點的能量與其組成團的點的部分能量函數即可。 R(i,j)=1; Epos=h*R(i,j)-2*beta*(R(i+1,j)*R(i,j)+R(i-1,j)*R(i,j)+R(i,j+1)*R(i,j)+R(i,j-1)*R(i,j))-yita*R(i,j)*YY(i,j); R(i,j)=-1; Eneg=h*R(i,j)-2*beta*(R(i+1,j)*R(i,j)+R(i-1,j)*R(i,j)+R(i,j+1)*R(i,j)+R(i,j-1)*R(i,j))-yita*R(i,j)*YY(i,j); if Epos~=Eneg R(i,j)=1.0*(Epos<Eneg)+(Epos>Eneg)*-1.0; else R(i,j)=temp; end if temp~=R(i,j) Change=1;%若有變化則繼續while1的系統掃描,若每個點都沒有改變則結束程序 end end end end for i=1:M for j=1:N if(R(i,j)==1) Y(i,j)=255; else Y(i,j)=0; end end end figure; imshow(Y) %錯誤的概率 disp( ['error rate is %d ' num2str(sum(sum(Y~=X))/(M*N))])
參考文獻:
本blog參考書籍(PRML8.3節)
ICM算法參考(Kittler and Foglein,1984)
本人水平有限,懷着分享學習的態度發表此文,歡迎大家批評,交流。感謝您的閱讀。
歡迎轉載本文,轉載時請附上本文地址:http://www.cnblogs.com/Dzhouqi/p/3207601.html
另外:歡迎訪問我的博客 http://www.cnblogs.com/Dzhouqi/