大概像是下面这样(我是真的不会设计海报,大家凑乎着看叭)
我们要制作的就是上面这样的背景图,文章最后由完整代码
步骤
1.导入图片
导入图片并获得长宽及通道数信息,图片需要和m文件在同一文件夹:
I=imread('test.jpeg');
[W,H,nChanels]=size(I);
我用的原图在这里:
2.将图片扭曲到合适角度
degree=15;
eddy_mat=zeros(W,H,nChanels);
swirl_degree=degree./1000;
midX=W/2;
midY=H/2;
for y=1:H
for x=1:W
Yoffset=y-midY;
Xoffset=x-midX;
radian=atan2(Yoffset,Xoffset);
radius=sqrt(Xoffset^2+Yoffset^2);
X=int32(radius*cos(radian+radius*swirl_degree)+midX);
Y=int32(radius*sin(radian+radius*swirl_degree)+midY);
X(X>W)=W;Y(Y>H)=H;
X(X<1)=1;Y(Y<1)=1;
eddy_mat(x,y,:)=I(X,Y,:);
end
end
eddy_mat=uint8(eddy_mat);
3.构造映射矩阵
其实就是灰度化这张图,我们要根据图片的亮度绘制曲面,因而用灰度图做高度索引再适合不过
map_mat=rgb2gray(eddy_mat);
4.构造曲面,上色并调整角度
使用灰度图构造曲面,再把有色图贴图上去
[Xmesh,Ymesh]=meshgrid(1:H,1:W);
surf(Xmesh,map_mat,Ymesh,'EdgeColor','none','LineWidth',0.01,'CData',eddy_mat,'FaceColor','interp')
调整曲面角度,为了方便截图,可以把背景设置成黑色
axes=gca;
axes.PlotBoxAspectRatio=[0.6860 0.6875 1.0000];
axes.CameraPosition=[-0.9862 2.2773 1.5062].*1e3;
axes.Color=[0 0 0];
注可以将figure调大后截图
5.完整代码及成品效果
完整代码:
function FarGate
I=imread('test.jpeg');
[W,H,nChanels]=size(I);
degree=15;
eddy_mat=zeros(W,H,nChanels);
swirl_degree=degree./1000;
midX=W/2;
midY=H/2;
for y=1:H
for x=1:W
Yoffset=y-midY;
Xoffset=x-midX;
radian=atan2(Yoffset,Xoffset);
radius=sqrt(Xoffset^2+Yoffset^2);
X=int32(radius*cos(radian+radius*swirl_degree)+midX);
Y=int32(radius*sin(radian+radius*swirl_degree)+midY);
X(X>W)=W;Y(Y>H)=H;
X(X<1)=1;Y(Y<1)=1;
eddy_mat(x,y,:)=I(X,Y,:);
end
end
eddy_mat=uint8(eddy_mat);
disp('已完成图像旋转...'),pause(0.5)
%T=affine2d([1 0 0;0 1 0;0 0 1]);
%dst_mat=imwarp(eddy_mat,T);
imshow(eddy_mat)
map_mat=rgb2gray(eddy_mat);
disp('已获得映射矩阵...'),pause(0.5)
imshow(map_mat)
[Xmesh,Ymesh]=meshgrid(1:H,1:W);
surf(Xmesh,map_mat,Ymesh,'EdgeColor','none','LineWidth',0.01,'CData',eddy_mat,'FaceColor','interp')
disp('已构造曲面...'),pause(0.5)
axes=gca;
axes.PlotBoxAspectRatio=[0.6860 0.6875 1.0000];
axes.CameraPosition=[-0.9862 2.2773 1.5062].*1e3;
axes.Color=[0 0 0];
disp('已调整曲面角度')
end
转载:https://blog.csdn.net/slandarer/article/details/115457724
查看评论