• 马尔可夫随机场(Markov random fields) 概率无向图模型 马尔科夫网(Markov network)


    上面两篇博客,解释了概率有向图(贝叶斯网),和用其解释条件独立。本篇将研究马尔可夫随机场(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/

  • 相关阅读:
    个人推荐网上商店
    vs 安装程序制作
    this linker was not configured to use sysroots和C compiler cannot create executables的解决办法
    将asihttprequest编译后的目标文件打包
    cygwin下的gcc4.7.1编译心得
    给ubuntu12.04换3.4.6的内核
    boost::asio::streambuf相关的操作方法
    应用boost库serialize标准库里的map
    cygwin下gdb7.4编译
    sql server存储过程分页,支持cte
  • 原文地址:https://www.cnblogs.com/Dzhouqi/p/3207601.html
Copyright © 2020-2023  润新知