首页 分享 教你使用MATLAB绘制超超超炫丽的烟花!

教你使用MATLAB绘制超超超炫丽的烟花!

来源:花匠小妙招 时间:2025-05-13 19:53
效果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

步骤 1.随机点生成

我们要构造一个黑色背景,对其添加高斯噪声,然后依据阈值删掉部分噪声,生成一张随机点图片:

blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.1); distPic(distPic<254)=0; 123

在这里插入图片描述

2.图像膨胀

我们发现之前构造的点太小了,我们要对其进行形态学膨胀处理:

se=strel('square',3); distPic=imdilate(distPic,se); 12

在这里插入图片描述

3.特效[风]模拟

就是建立一个循环,不断地将点往右侧复制,并将颜色变暗:
代码中第二个参数为拖拽长度,第三个参数为暗化速度

windPic=wind(distPic,180,0.99); function resultPic=wind(oriPic,len,ratio) oriPic=double(oriPic); for i=1:len tempPic=[zeros(size(oriPic,1),1),oriPic(:,1:(end-1))].*ratio; oriPic(oriPic<tempPic)=tempPic(oriPic<tempPic); end resultPic=uint8(oriPic); end 12345678910

在这里插入图片描述

4.极坐标变换

polarPic=polarTransf(windPic(:,end:-1:1)'); function resultPic=polarTransf(oriPic) oriPic=double(oriPic); [m,n]=size(oriPic); [t,r]=meshgrid(linspace(-pi,pi,n),1:m); M=2*m; N=2*n; [NN,MM]=meshgrid((1:N)-n-0.5,(1:M)-m-0.5); T=atan2(NN,MM); R=sqrt(MM.^2+NN.^2); resultPic=interp2(t,r,oriPic,T,R,'linear',0); resultPic=uint8(resultPic); end

12345678910111213141516

在这里插入图片描述

5.图像模糊及再映射

我们发现烟花图片中心区域方格化严重:
在这里插入图片描述
我们很容易想到图像模糊,但是模糊后亮度又不够,因此我们再做一次映射将图片整体亮度提高:
模糊及映射:

polarPic=imgaussfilt(polarPic,1.5); polarPic=uint8(double(polarPic)./double(max(max(polarPic))).*260); 12

在这里插入图片描述

6.图像上色

matSize=[1600,1600]; point=[800,800]; colorList=[255 253 255 255 255 244 250 255 219 212 242 156 90 167 3 32 96 0 56 82 0]; colorMat=cColorMat(matSize,point,colorList); colorMatR=colorMat(:,:,1); colorMatG=colorMat(:,:,2); colorMatB=colorMat(:,:,3); fwPicR=double(colorMatR).*double(polarPic)./255; fwPicG=double(colorMatG).*double(polarPic)./255; fwPicB=double(colorMatB).*double(polarPic)./255; fwPic(:,:,1)=fwPicR; fwPic(:,:,2)=fwPicG; fwPic(:,:,3)=fwPicB; fwPic=uint8(fwPic); imshow(fwPic) function colorMat=cColorMat(matSize,point,colorList) % matSize=[800,600]; % point=[400,100]; % colorList=[195 53 93 % 211 102 141 % 231 179 192 % 229 182 172 % 227 178 137 % 238 191 147 % 236 195 113]; % colorMat=cColorMat(matSize,point,colorList); % imshow(colorMat) [xMesh,yMesh]=meshgrid(1:matSize(2),1:matSize(1)); zMesh=sqrt((xMesh-point(2)).^2+(yMesh-point(1)).^2); zMesh=(zMesh-min(min(zMesh)))./(max(max(zMesh))-min(min(zMesh))); colorFunc=colorFuncFactory(colorList); colorMesh=colorFunc(zMesh); colorMat(:,:,1)=colorMesh(end:-1:1,1:matSize(1)); colorMat(:,:,2)=colorMesh(end:-1:1,matSize(1)+1:2*matSize(1)); colorMat(:,:,3)=colorMesh(end:-1:1,2*matSize(1)+1:3*matSize(1)); colorMat=uint8(colorMat); end function colorFunc=colorFuncFactory(colorList) x=(0:size(colorList,1)-1)./(size(colorList,1)-1); y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3); colorFunc=@(X)[interp1(x,y1,X,'linear')',interp1(x,y2,X,'linear')',interp1(x,y3,X,'linear')']; end

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657

在这里插入图片描述
其他几个颜色:

colorList2=[25 59 157 24 71 219 38 124 237 93 215 255 168 244 255 243 254 250 246 252 240]; colorList3=[239 250 210 229 164 122 232 150 138 255 164 204 192 58 111 158 10 26 224 168 121]; 1234567891011121314 7.完整代码

function drawFireWorks blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.1); distPic(distPic<254)=0; se=strel('square',3); distPic=imdilate(distPic,se); windPic=wind(distPic,180,0.99); polarPic=polarTransf(windPic(:,end:-1:1)'); polarPic=imgaussfilt(polarPic,1.5); polarPic=uint8(double(polarPic)./double(max(max(polarPic))).*260); imshow(polarPic) %----------------------------------------------------------------- matSize=[1600,1600]; point=[800,800]; colorList=[255 253 255 255 255 244 250 255 219 212 242 156 90 167 3 32 96 0 56 82 0]; % colorList2=[25 59 157 % 24 71 219 % 38 124 237 % 93 215 255 % 168 244 255 % 243 254 250 % 246 252 240]; % colorList3=[239 250 210 % 229 164 122 % 232 150 138 % 255 164 204 % 192 58 111 % 158 10 26 % 224 168 121]; colorMat=cColorMat(matSize,point,colorList); colorMatR=colorMat(:,:,1); colorMatG=colorMat(:,:,2); colorMatB=colorMat(:,:,3); fwPicR=double(colorMatR).*double(polarPic)./255; fwPicG=double(colorMatG).*double(polarPic)./255; fwPicB=double(colorMatB).*double(polarPic)./255; fwPic(:,:,1)=fwPicR; fwPic(:,:,2)=fwPicG; fwPic(:,:,3)=fwPicB; fwPic=uint8(fwPic); imshow(fwPic) %========================================================================== function resultPic=wind(oriPic,len,ratio) oriPic=double(oriPic); for i=1:len tempPic=[zeros(size(oriPic,1),1),oriPic(:,1:(end-1))].*ratio; oriPic(oriPic<tempPic)=tempPic(oriPic<tempPic); end resultPic=uint8(oriPic); end function resultPic=polarTransf(oriPic) oriPic=double(oriPic); [m,n]=size(oriPic); [t,r]=meshgrid(linspace(-pi,pi,n),1:m); M=2*m; N=2*n; [NN,MM]=meshgrid((1:N)-n-0.5,(1:M)-m-0.5); T=atan2(NN,MM); R=sqrt(MM.^2+NN.^2); resultPic=interp2(t,r,oriPic,T,R,'linear',0); resultPic=uint8(resultPic); end %========================================================================== function colorMat=cColorMat(matSize,point,colorList) % matSize=[800,600]; % point=[400,100]; % colorList=[195 53 93 % 211 102 141 % 231 179 192 % 229 182 172 % 227 178 137 % 238 191 147 % 236 195 113]; % colorMat=cColorMat(matSize,point,colorList); % imshow(colorMat) [xMesh,yMesh]=meshgrid(1:matSize(2),1:matSize(1)); zMesh=sqrt((xMesh-point(2)).^2+(yMesh-point(1)).^2); zMesh=(zMesh-min(min(zMesh)))./(max(max(zMesh))-min(min(zMesh))); colorFunc=colorFuncFactory(colorList); colorMesh=colorFunc(zMesh); colorMat(:,:,1)=colorMesh(end:-1:1,1:matSize(1)); colorMat(:,:,2)=colorMesh(end:-1:1,matSize(1)+1:2*matSize(1)); colorMat(:,:,3)=colorMesh(end:-1:1,2*matSize(1)+1:3*matSize(1)); colorMat=uint8(colorMat); end function colorFunc=colorFuncFactory(colorList) x=(0:size(colorList,1)-1)./(size(colorList,1)-1); y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3); colorFunc=@(X)[interp1(x,y1,X,'linear')',interp1(x,y2,X,'linear')',interp1(x,y3,X,'linear')']; end end

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117

相关知识

HTML+CSS+JavaScript 超具创意的网页生日快乐祝福网页模板
12个超炫数据可视化工具
超简单又超美!玫瑰花苹果派
教你折超可爱的迷你花...
江浙沪必看!太湖边超梦幻烟花秘境
超帅超流行的飞身射牌
多肉植物长白虫子怎么办?老花匠教你几招,超实用!
超好看的鸢尾花礼盒
超超超美味简单的樱桃罐头!
手工DIY玫瑰花,简单又有爱,送女朋友超喜欢

网址: 教你使用MATLAB绘制超超超炫丽的烟花! https://www.huajiangbk.com/newsview1947531.html

所属分类:花卉
上一篇: 烟花的意思
下一篇: 迪拜在哈利法塔举行庆祝新年的盛大

推荐分享