📄 topolar.m
字号:
function [rmax,polarv]=topolar(v,x0,y0,np)
%本函数旨在实现将hsv中的v分量从直角坐标下转化为极坐标下的polarv,其中v为直角坐标系下的v分量,x0,y0为要指定极坐标原点,
%N为一周等间距相位数
[pic_ysize,pic_xsize]=size(v);np=360;
M=pic_ysize;N=pic_xsize;
%x0=round(pic_xsize/2);y0=round(pic_ysize/2);%%极坐标原点,图像的中心点
for i=1:pic_ysize
for j=1:pic_xsize
dis(i,j)=sqrt((i-y0)^2+(j-x0)^2);
end
end
Rmax=round(max(dis(:)));%%半径最大值
pmax=2*pi;%相位最大值,一个周期
dp=pmax/np;%相位间距,分360份
p1=atan((M-y0)/(N-x0));p2=-atan((M-y0)/(x0-1))+pi;p3=atan((y0-1)/(x0-1))+pi;p4=-atan((y0-1)/(N-x0))+2*pi;
%图像中四个顶点对应弧度,其中p1,p2,p3,p4分别表示右下角,左下角,左上角,右上角对应值
polarv=zeros(np,Rmax);
for i=0:np-1
p=dp*i;
%polarv(i+1,1)=v(x0,y0);
if(p>=p1&p<p2)
rmax(i+1)=floor((M-y0)/abs(sin(p)));
elseif(p>=p3&p<p4)
rmax(i+1)=floor((y0-1)/abs(sin(p)));
elseif(p>=p2&p<p3)
rmax(i+1)=floor((x0-1)/abs(cos(p)));
else
rmax(i+1)=floor((N-x0)/abs(cos(p)));
end
for j=1:rmax(i+1)
x=x0+j*cos(p);
y=y0+j*sin(p);
x1=floor(x);x2=x1+1;y1=floor(y);y2=y1+1;
if(x1~=0&x1~=pic_xsize&y1~=0&y1~=pic_ysize)
e=(x-x1)*(v(y1,x2)-v(y1,x1))+v(y1,x1);
f=(x-x1)*(v(y2,x2)-v(y2,x1))+v(y2,x1);
polarv(i+1,j+1)=(y-y1)*(f-e)+e;%polarv为极坐标下的新图像,从直角坐标转化为极坐标时用的是双线性插值
elseif(x1==pic_xsize|y1==pic_ysize)
polarv(i+1,j+1)=v(floor(y1),floor(x1));
else
polarv(i+1,j+1)=v(y2,x2);
end
end
end
%imshow(polarv); %显示极坐标下的图像
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -