基于马尔可夫随机场的图像去噪算法matlab仿真

161 阅读3分钟

1.算法运行效果图预览

原图:

b11b542d5c2e613a4e2d78271225eb6d_82780907_202401120009370386333473_Expires=1704989977&Signature=9hlipzCbsf5XBe%2FZe4nmMwbWwUg%3D&domain=8.jpeg

加入噪声的图像:

9dd8f4609d844fbf57b05bb6b34386be_82780907_202401120010280964394930_Expires=1704990028&Signature=z73TRathvbTtgoTwZXFv2KOpVkI%3D&domain=8.jpeg

滤波后的图像

be8f3ee335a795324ce5d9699538f0ac_82780907_202401120011120511228508_Expires=1704990072&Signature=jcySAwQJtt4fINdpYYT7T%2Ftpjgg%3D&domain=8.jpeg  

迭代过程:

  c044d7ff50ff928b065af3c7d3a3eccb_82780907_202401120011550761750887_Expires=1704990115&Signature=4dfQFP6heX%2BpZX5aK8%2FDq%2FY%2FLYU%3D&domain=8.jpeg

7fbc0a3aaf6da1f7bbe189ec132e13ba_82780907_202401120011550995526876_Expires=1704990116&Signature=jFo%2FlTC3EAq52eRwyHDX9GhmOko%3D&domain=8.jpeg

 

2.算法运行软件版本

matlab2022a

 

3.算法理论概述

       马尔可夫随机场(Markov Random Field,简称MRF)是一种用于图像处理的统计模型。它在图像去噪、分割和识别等方面有着广泛的应用。图像去噪是图像处理中的一个重要问题,旨在从噪声污染的图像中恢复出原始图像。马尔可夫随机场为这一问题提供了一个有效的解决方案。本文将详细介绍基于马尔可夫随机场的图像去噪算法的原理和数学公式。

 

3.1、马尔可夫随机场的基本原理

        马尔可夫随机场是一种概率图模型,用于建模具有随机变量之间相互作用的问题。在图像去噪中,马尔可夫随机场将图像中的每个像素看作一个随机变量,并建模像素之间的相互作用。这种相互作用可以通过能量函数来表示。马尔可夫随机场的目标是找到一个配置,使得能量函数的值最小。

 

3.2、基于马尔可夫随机场的图像去噪算法

       图像去噪的目的是从噪声污染的图像中恢复出原始图像。基于马尔可夫随机场的图像去噪算法通过定义一个能量函数来实现这一目标。能量函数包含了数据项和平滑项:

 

数据项:衡量去噪后的图像与原始噪声图像之间的差异。

平滑项:衡量去噪后的图像中相邻像素之间的差异,以保持图像的平滑性。

具体的能量函数可以定义为:

 

E(x)=∑i∈IData(xi)+∑(i,j)∈ISmooth(xi,xj)E(x) = \sum_{i \in I} Data(x_i) + \sum_{(i,j) \in I} Smooth(x_i, x_j)E(x)=∑i∈I​Data(xi​)+∑(i,j)∈I​Smooth(xi​,xj​)

 

        其中,xxx是去噪后的图像,III是图像中像素的索引集,Data(xi)Data(x_i)Data(xi​)是数据项,衡量去噪后的像素xixi​与原始噪声图像中对应像素的差异,Smooth(xi,xj)Smooth(x_i, x_j)Smooth(xi​,xj​)是平滑项,衡量去噪后的像素xixi​与相邻像素xjxj​之间的差异。

 

        为了求解这个最优化问题,可以使用图割、置信传播等算法。这些算法能够在多项式时间内找到能量函数的最小值,从而得到去噪后的图像。

 

 

 

 

4.部分核心程序 `clc;

clear;

close all;

warning off;

addpath(genpath(pwd));

rng('default')

I0     = imread('test0.bmp');

I1     = I0;

Ibw    = 2*im2bw(I0)-1;

I11    = Ibw;

 

figure;

imshow(Ibw)

 

%加入噪声

In     = 2*imnoise(Ibw,'salt & pepper',0.1)-1;

 

figure;

imshow(In);

 

 

%真正改变的百分比是多少

num=0;

for i=1:size(I0,1)

    for j=1:size(I0,2)

        if In(i,j)~=I11(i,j)

           num=num+1;

        end

    end

end

List   = [0,0.1,0.02];

In2    = In;

%计算能量

Ieng   = func_image_energy(In,In2,List);

In2    = In;

Ieng0  = Ieng;

 

%迭代

figure;

for p =1:20%迭代20次

    p

    err0=[];

    for i=1 :size(In2,1)-1

        for j=1:size(In2,2)-1

            [In2,~,Ieng] = func_pixel(In,In2,i,j, Ieng,List);

        end

        if (Ieng - Ieng0) == 0

            continue

        end

        err0=[err0,abs(Ieng - Ieng0)];

    end

    Ieng0 = Ieng;

subplot(4,5,p);

imshow(In2);

title(['迭代次数:',num2str(p)]);

 

 

err(p)=mean(err0);

end

 

figure;

semilogy(err,'b-o');

grid on

xlabel('迭代次数');

ylabel('error');

 

figure;

imshow(In2);`