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()就都一样了嘛。