代码改变世界

概率图模型PFM——无向图

2013-08-20 15:10  Loull  阅读(1748)  评论(0编辑  收藏  举报

 

马尔科夫随机场MRF联合概率分解,用到clique的概念,翻译“团”,是图上的连接子图。

 

两个最大团(x1,x2,xx3)和(x2,x3,x4)

MRF联合概率分解的另一个概念是potential function(势函数),联合概率分解成一系列potential函数的乘积。

Xc是最大团的所有结点。

一个potential function,是最大团的一个函数。

 

换一种理解方式,定义将potential function表示成指数函数

这样p(x)就可以表示成一系列E(Xc)的和的指数形式。

E(Xc)叫做能力函数,转化之后,可以将图理解为一个能力的集合,他的值等于各个最大团的能量的和。

 

优缺点:

无向图模型中势函数设计不受概率分布约束,设计灵活,但全局归一代价高。

有向图模型无需全局归一、训练相对高效

 

实验:

 

下面附上,上述实验的matlab代码。

% 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))])

http://www.cnblogs.com/Dzhouqi/p/3207601.html