zoukankan      html  css  js  c++  java
  • matlab练习程序(力场变换)

      把图像中每一个像素当成有质量的恒星,像素的灰度值就相当于恒星的质量,运用万有引力定律求得每个像素受到其他像素的“力”,获得力场图像。

      公式就是中学的万有引力公式,不过这里是向量场,所以每一个像素受到的力不是简单的叠加,是矢量求和。

      好像有用这个力场变换识别耳朵的。

      这里也是求模板大小的局部力场,全局力场我运行了1天,结果不太理想。

      相关代码:

    main.m

    clear all;
    close all;
    clc;
    
    r=3;
    img=imread('lena.jpg');
    img=double(img);
    [m n]=size(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);
    
    f_field=imgn;
    for i=1+r:m+r
       for j=1+r:n+r
          
           f=0;
           for p=i-r:i+r
              for q=j-r:j+r
                  if i~=p &&j~=q
                      p0=[i j];
                      lev=[i+10 j];
                      p1=[p q];
                      
                      jiao=multi_jiao(p1,lev,p0);       %以下四步是通过夹角定理与叉积确定向量和水平向量的夹角
                      flag=multi(p1,lev,p0);
                      jiao=xiangxian(jiao,flag);
                      jiao=mod(jiao,360);
                      
                      value=cos(jiao*pi/180);       %通过余弦确定权重,力场是一个向量场
                      f=f+imgn(i,j)*imgn(p,q)/sqrt((i-p)^2+(j-q)^2)*value;  %万有引力定律
                  end            
              end           
           end
           f_field(i,j)=f;       
       end    
    end
    
    figure;
    f_field=f_field(r+1:m+r,r+1:n+r);
    imshow(mat2gray(f_field));

    multi_jiao.m

    function re=multi_jiao(p1,p2,p0)    %判断<p10,p20>夹角
        x=1;
        y=2;
    
        vec1=p1-p0;
        vec2=p2-p0;
    
        re=acos(dot(vec1,vec2)/(norm(vec1)*norm(vec2)))*180/pi;
    end

    multi.m

    function re=multi(p1,p2,p0)     %p10,p20叉积,获取正负
        x=1;
        y=2;
       
       re=(p1(x)-p0(x))*(p2(y)-p0(y))-(p1(y)-p0(y))*(p2(x)-p0(x));
    
    end

    xiangxian.m

    function re=xiangxian(jiao,flag)
       
        if flag>0
            re=360-jiao;
        else
            re=jiao;            
        end              
       
    end

    下面是运行效果:

    原图

    7*7的局部力场

    简单的标量求和,似乎有一种朦胧美

  • 相关阅读:
    c++ 的几种强制转换的讨论
    观察者模式
    epoll实现linux进程通信
    vim 实现 go to definition的功能
    svn 的使用
    makefile文件的技术
    [转]epoll技术
    [转]poll技术
    Linux重定向的理解
    避免僵死进程的方法
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2814701.html
Copyright © 2011-2022 走看看