力场变换
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+rfor j=1+r:n+rf=0;for p=i-r:i+rfor q=j-r:j+rif i~=p &&j~=qp0=[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 endf_field(i,j)=f; end endfigure; 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; endmulti.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));endxiangxian.m
function re=xiangxian(jiao,flag)if flag>0re=360-jiao;elsere=jiao; end end下面是運行效果:
原圖
7*7的局部力場
簡單的標量求和,似乎有一種朦朧美
總結
- 上一篇: Robust principal com
- 下一篇: 图像细化