matlab练习程序(表面模糊)

  关于表面模糊的文章我是搜遍互联网只找到下面这两篇:

  1.http://bbs.redocn.com/viewthread.php?tid=274838&extra=&page=1

  2.http://blog.csdn.net/maozefa/article/details/7710321

  第一篇原理比较清楚,不过没有代码;第二篇原理就不太清楚了,不过有代码,就看各位能不能看懂汇编了。

  关于表面模糊,和其他模糊不同的是,其他模糊一般整个图像只用一个模板矩阵,而表面模糊对每一个像素都需要建立一个模版矩阵,因此计算量要大很多。

  模版矩阵这样计算:w(i,j)=1-abs(x(i,j)-x(r+1,r+1))/(2.5*T)。其实我总感觉阿发伯的那篇文章的公式他给错了,第一篇文章才是正确的。

  解释一下:确定模糊模板有两参数。1.r是模板半径,那么整个模板矩阵就有(2*r+1)^2个像素;2.T是阈值,确定模板中对应不同像素有不同权重。w就是模版矩阵了。x(i,j)是当前模板选中的像素,x(r+1,r+1)是当前模板最中间的像素也就是当前图像选中的像素。

  也许上面的解释让人听的云里雾里的,不过没关系,下面结合代码就能很好的理解了。

clear all;
close all;
clc;
r=11;       %半径
T=36;       %阈值
w=zeros(2*r+1,2*r+1);

img=imread('lena.jpg');
img=double(img);
[m n]=size(img);
imshow(mat2gray(img));

imgn=zeros(m+2*r+1,n+2*r+1);
imgn(r+1:m+r,r+1:n+r)=img;

imgn(1:r,r+1:n+r)=img(1:r,1:n);      %这里就用到了上一篇文章介绍的边界扩展
imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);
imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);


for i=r+1:m+r
    for j=r+1:n+r

        w=1-abs(imgn(i-r:i+r,j-r:j+r)-imgn(i,j))/(2.5*T);   %这里很关键
        for p=1:2*r+1
            for q=1:2*r+1              
                if w(p,q) <=0
                    w(p,q)=0;
                end
            end
        end

        s=w.*imgn(i-r:i+r,j-r:j+r);             %下面是普通的加权平均
        imgn(i,j)=sum(sum(s))/sum(sum(w));
  
    end
end

figure;
img=imgn(r+1:m+r,r+1:n+r);
imshow(mat2gray(img));

  下面是处理的效果:

原图

这里处理的效果

photoshop中把半径设为11,阈值设为36处理的效果

  整体灰度虽然稍有不同,不过整体灰度嘛,呵呵,在matlab中加个mat2gray()就都一样了嘛。

原文地址:https://www.cnblogs.com/tiandsp/p/2756441.html