大概像是下面这样(我是真的不会设计海报,大家凑乎着看叭)
我们要制作的就是上面这样的背景图,文章最后由完整代码
导入图片并获得长宽及通道数信息,图片需要和m文件在同一文件夹:
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);
其实就是灰度化这张图,我们要根据图片的亮度绘制曲面,因而用灰度图做高度索引再适合不过
map_mat=rgb2gray(eddy_mat);
使用灰度图构造曲面,再把有色图贴图上去
[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];
完整代码:
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
抖音同款系列又出了两篇哟,大家可以去看一下:
MATLAB 制作抖音同款 立体人物文字海报
MATLAB 制作抖音同款含褶皱面料图