服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 基于Matlab绘制超绚丽的烟花的过程详解

基于Matlab绘制超绚丽的烟花的过程详解

2022-10-07 16:14slandarer C/C++

这篇文章主要为大家介绍了如何利用Matlab绘制超绚丽的烟花,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下

1.使用效果

基于Matlab绘制超绚丽的烟花的过程详解

基于Matlab绘制超绚丽的烟花的过程详解

 

2.随机点生成

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

% 构造黑色背景并生成白色杂点
blackPic=uint8(zeros(800,800));
distPic=imnoise(blackPic,'gaussian',0, 0.11);
distPic(distPic<254)=0;

基于Matlab绘制超绚丽的烟花的过程详解

 

3.图像膨胀

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

% 杂点膨胀
se=strel('square',3);
distPic=imdilate(distPic,se);

基于Matlab绘制超绚丽的烟花的过程详解

 

4.特效「风」模拟

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

% 构造风特效
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

基于Matlab绘制超绚丽的烟花的过程详解

 

5.级坐标变换

% 极坐标变换
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

基于Matlab绘制超绚丽的烟花的过程详解

 

6.图像模糊及再映射

我们发现烟花图片中心区域方格化严重:

基于Matlab绘制超绚丽的烟花的过程详解

我们很容易想到图像模糊,但是模糊后亮度又不够,因此我们再做一次映射将图片整体亮度提高:

模糊及映射:

% 模糊以减少像素化
polarPic=imgaussfilt(polarPic,1.5);
polarPic=uint8(double(polarPic)./double(max(max(polarPic))).*260);

基于Matlab绘制超绚丽的烟花的过程详解

 

7.图像上色

生成一个圆形的渐变图片,并与白色烟花图片进行一次正交叠底:

% 构造圆形渐变图
matSize=[1600,1600];
point=[800,800];
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);
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)
  [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

基于Matlab绘制超绚丽的烟花的过程详解

其他几个颜色:

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];

 

8.完整代码

function drawFireWorks

% 构造黑色背景并生成白色杂点
blackPic=uint8(zeros(800,800));
distPic=imnoise(blackPic,'gaussian',0, 0.11);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);

%-----------------------------------------------------------------
% 构造圆形渐变图
matSize=[1600,1600];
point=[800,800];
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);
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)
  [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

以上就是基于Matlab绘制超绚丽的烟花的过程详解的详细内容,更多关于Matlab绘制烟花的资料请关注服务器之家其它相关文章!

原文链接:https://mp.weixin.qq.com/s/67Wpvjm3FT-b0XgvAYvCvA

延伸 · 阅读

精彩推荐
  • C/C++C++实现LeetCode(120.三角形)

    C++实现LeetCode(120.三角形)

    这篇文章主要介绍了C++实现LeetCode(120.三角形),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang6612021-12-02
  • C/C++CLion安装、汉化、配置图文详解

    CLion安装、汉化、配置图文详解

    这篇文章主要介绍了CLion安装、汉化、激活、配置图文详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值...

    Truda.7442021-10-07
  • C/C++函数指针的一些概念详解

    函数指针的一些概念详解

    首先看函数指针的语法,举一个最简单的例子,要创建一个函数指针,则它与它指向的函数,在参数个数类型以及返回值上都保持一致,跟重载的要求应该...

    C语言教程网7912021-01-01
  • C/C++介绍C语言中tolower函数的实例

    介绍C语言中tolower函数的实例

    这篇文章主要介绍了介绍C语言中tolower函数的实例,本文列出了该函数的头文件,功能说明等,以及如何使用,以下就是详细内容,需要的朋友可以参考下...

    C语言技术网-码农有道3932021-11-21
  • C/C++详谈C++ socket网络编程实例(2)

    详谈C++ socket网络编程实例(2)

    这篇文章主要为大家介绍了C++ socket网络编程实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    ufgnix080212052022-02-28
  • C/C++使用Visual Studio 2010/2013编译V8引擎步骤分享

    使用Visual Studio 2010/2013编译V8引擎步骤分享

    这篇文章主要介绍了使用Visual Studio 2013编译V8引擎步骤分享,需要的朋友可以参考下...

    C语言教程网7782021-03-05
  • C/C++Cocos2d-x UI开发之菜单类使用实例

    Cocos2d-x UI开发之菜单类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之菜单类使用实例,本文的代码中含有详细注释,需要的朋友可以参考下...

    皂荚花7382021-02-01
  • C/C++libevent库的使用--定时器的使用实例

    libevent库的使用--定时器的使用实例

    这篇文章主要介绍了libevent库的使用--定时器的使用实例,有需要的朋友可以参考一下...

    C语言教程网8902021-01-12