matlab练习程序(动感模糊)

摘要:
事实上,在matlab中调用系统函数fsspecial和imfilter可以很容易地实现动态模糊,但我不想这么简单地实现,所以我从头开始编写。以上是我构建矩阵的方法,与matlab和photoshop的方法不同。我不知道它们是如何构造的。Photoshop完全不清楚,matlab也无法分析。代码如下:clearall;关闭;clc;r=50;%模糊半径角度=-45;%模糊角角=mod;%经此处理后,适用于所有角度。

  其实在matlab中调用系统函数fspecial和imfilter这两个函数就能很简单的实现动感模糊,不过我可不想就这样简单的实现,所以就自己从头写了。动感模糊最复杂的就是构造卷积矩阵了,卷积矩阵由两个参数决定,模糊半径r和模糊角度theta,通过这两个参数,就能构造不同的模板矩阵,而图像卷积时则和普通的卷积没有什么区别。

  构造模板矩阵,首先是通过模糊半径r确定模板矩阵的宽和高,这里需要用到勾股定理,这里的r其实就相当于勾股定理中的弦,也就是斜边,那么模板的高就是r*sin(theta),宽就是r*cos(theta),为了下面卷积的方便,判断这里的宽和高,把不是奇数的加1变为奇数。然后是通过theta确定模板矩阵中数据的位置,这里只要符合h=w*tan(theta)这样一个关系的位置就都赋值r,然后对矩阵归一化就行了。当然,边界处理的细节就看下面的代码吧。

  上面是我构造矩阵的方法,和matlab与photoshop都不一样,不太清楚他们是怎样构造的,photoshop是完全不清楚,matlab是分析不出来。维基百科上有一个构造公式:http://zh.wikipedia.org/wiki/%E5%8B%95%E6%85%8B%E6%A8%A1%E7%B3%8A,不过我试了试,用这种方法好像构造不出来,if的第二个条件我不太清楚意义是什么。

下面是代码:

clear all;
close all;
clc;
r=50;           %模糊半径
jiaodu=-45;      %模糊角度
jiaodu=mod(jiaodu,360);     %经过这个处理,对所有角度均适用了。
flag=0;

%%下面是把卷积模板做出来。
if jiaodu>=0 && jiaodu<90
    jiaodu=jiaodu;
    flag=1;
end

if jiaodu>=90 && jiaodu<180
    jiaodu=180-jiaodu;
    flag=2;
end

if jiaodu>=180 && jiaodu<270
    jiaodu=jiaodu-180;
    flag=3;
end

if jiaodu>=270 && jiaodu<360
    jiaodu=360-jiaodu;
    flag=4;
end

H=floor(r*sin(jiaodu*pi/180));
W=floor(r*cos(jiaodu*pi/180));

if mod(H,2)==0
    H=H+1;
end

if mod(W,2)==0
    W=W+1;
end

w=zeros(H,W);
if jiaodu ~= 90 && jiaodu ~= 270
    for i=1:H
        for j=1:W
            tmp=floor(j*tan(jiaodu*pi/180));
            if tmp+1==i
                w(i,j)=r;
            end
        end
    end
else
    for i=1:H
        w(i,1)=r;
    end
end

w=w/sum(sum(w));
if flag==1 || flag==3       %如果角度在1,3象限,卷积矩阵上下翻转
    w=flipud(w);        
end

%%下面是正常的图像处理,卷积等
HH=floor(H/2);
WW=floor(W/2);

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

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

imgn(1:HH,WW+1:n+WW)=img(1:HH,1:n); 
imgn(1:m+HH,n+WW+1:n+2*WW+1)=imgn(1:m+HH,n:n+WW);
imgn(m+HH+1:m+2*HH+1,WW+1:n+2*WW+1)=imgn(m:m+HH,WW+1:n+2*WW+1);
imgn(1:m+2*HH+1,1:WW)=imgn(1:m+2*HH+1,WW+1:2*WW);

for i=HH+1:m+HH
    for j=WW+1:n+WW        
        s=imgn(i-HH:i+HH,j-WW:j+WW).*w;
        imgn(i,j)=sum(sum(s))/sum(sum(w));    
    end
end

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

下面是效果:

matlab练习程序(动感模糊)第1张原图

matlab练习程序(动感模糊)第2张这里的处理效果,半径为50,角度为-45度

matlab练习程序(动感模糊)第3张photoshop中相同参数的处理效果。

免责声明:文章转载自《matlab练习程序(动感模糊)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CNUTCon2018-ApacheSkyWalkingV6.0可定制开源spark保存读取csv SequenceFile下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

matlab环境配置

一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录atlas_Athlon.dll.路径是相对的,根据的安装的路径来设置变量的值,如默认安装于C盘则设为C:MATLAB7inwin32atlas_Athlon.dll. atl...

php 二维数组索引乱序 shuffle() 函数;

在实际开发中有一个打乱数组排序的案例   案例代码如下 public function index(){ if(IS_POST){ #获取卖单列表 $buy_list=M('buy')->where(['status'=>1])->field('num')->sele...

sklearn.svc 参数

sklearn.svc 参数 sklearn中的SVC函数是基于libsvm实现的,所以在参数设置上有很多相似的地方。(PS: libsvm中的二次规划问题的解决算法是SMO)。 对于SVC函数的参数解释如下:(主要翻译的sklearn 文档) C: float参数 默认值为1.0 错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确...

matlab函数——shading函数

函数说明: 是阴影函数控制曲面和图形对象的颜色着色,即用来处理色彩效果的,包括以下三种形式: shading faceted:默认模式,在曲面或图形对象上叠加黑色的网格线; shading flat:是在shading faceted的基础上去掉图上的网格线; shading interp:对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡 ;...

灰度共生矩阵--纹理

共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。 一幅图象的灰度共生矩阵能反映出图象灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图象的局部模式和它们排列规则的基础。 设f(x,y)为一幅二维数字图象,其大小为M...

单阶多层检测器: SSD(一)

  对于物体检测任务, 第4章的Faster RCNN算法采用了两阶的检测架构, 即首先利用RPN网络进行感兴趣区域生成, 然后再对该区域进行类别的分类与位置的回归, 这种方法虽然显著提升了精度, 但也限制了检测速度。 YOLO算法利用回归的思想, 使用一阶网络直接完成了物体检测, 速度很快, 但是精度有了明显的下降。   在此背景下, SSD(Singl...