基于Matlab繪制超絢麗的煙花的過程詳解
1.使用效果
2.隨機(jī)點(diǎn)生成
我們要構(gòu)造一個(gè)黑色背景,對(duì)其添加高斯噪聲,然后依據(jù)閾值刪掉部分噪聲,生成一張隨機(jī)點(diǎn)圖片:
% 構(gòu)造黑色背景并生成白色雜點(diǎn) blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.11); distPic(distPic<254)=0;
3.圖像膨脹
我們發(fā)現(xiàn)之前構(gòu)造的點(diǎn)太小了,我們要對(duì)其進(jìn)行形態(tài)學(xué)膨脹處理:
% 雜點(diǎn)膨脹 se=strel('square',3); distPic=imdilate(distPic,se);
4.特效「風(fēng)」模擬
就是建立一個(gè)循環(huán),不斷地將點(diǎn)往右側(cè)復(fù)制,并將顏色變暗,代碼中第二個(gè)參數(shù)為拖拽長度,第三個(gè)參數(shù)為暗化速度:
% 構(gòu)造風(fēng)特效 windPic=wind(distPic,180,0.99); % 風(fēng)特效構(gòu)造函數(shù) 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
5.級(jí)坐標(biāo)變換
% 極坐標(biāo)變換 polarPic=polarTransf(windPic(:,end:-1:1)'); % 級(jí)坐標(biāo)變換構(gòu)造函數(shù) 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
6.圖像模糊及再映射
我們發(fā)現(xiàn)煙花圖片中心區(qū)域方格化嚴(yán)重:
我們很容易想到圖像模糊,但是模糊后亮度又不夠,因此我們?cè)僮鲆淮斡成鋵D片整體亮度提高:
模糊及映射:
% 模糊以減少像素化 polarPic=imgaussfilt(polarPic,1.5); polarPic=uint8(double(polarPic)./double(max(max(polarPic))).*260);
7.圖像上色
生成一個(gè)圓形的漸變圖片,并與白色煙花圖片進(jìn)行一次正交疊底:
% 構(gòu)造圓形漸變圖 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) %========================================================================== % 圖像顏色映射函數(shù) 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
其他幾個(gè)顏色:
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 % 構(gòu)造黑色背景并生成白色雜點(diǎn) blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.11);distPic(distPic<254)=0; % 雜點(diǎn)膨脹 se=strel('square',3); distPic=imdilate(distPic,se); % 構(gòu)造風(fēng)特效 windPic=wind(distPic,180,0.99); % 極坐標(biāo)變換 polarPic=polarTransf(windPic(:,end:-1:1)'); % 模糊以減少像素化 polarPic=imgaussfilt(polarPic,1.5); polarPic=uint8(double(polarPic)./double(max(max(polarPic))).*260); %----------------------------------------------------------------- % 構(gòu)造圓形漸變圖 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) %========================================================================== % 風(fēng)特效構(gòu)造函數(shù) 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 % 極坐標(biāo)變換構(gòu)造函數(shù) 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 %========================================================================== % 圖像顏色映射函數(shù) 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繪制超絢麗的煙花的過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Matlab繪制煙花的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
opencv3/C++ 實(shí)現(xiàn)SURF特征檢測
今天小編就為大家分享一篇opencv3/C++ 實(shí)現(xiàn)SURF特征檢測,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12C語言實(shí)現(xiàn)簡單通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07深入分析Visual C++進(jìn)行串口通信編程的詳解
本篇文章是對(duì)Visual C++進(jìn)行串口通信編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05對(duì)比分析C語言中的gcvt()和ecvt()以及fcvt()函數(shù)
這篇文章主要介紹了對(duì)比分析C語言中的gcvt和ecvt以及fcvt函數(shù),都是將數(shù)字轉(zhuǎn)化為字符串,注意其之間的功能區(qū)別,需要的朋友可以參考下2015-08-08C語言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)
C語言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ法檢查并不象其它高級(jí)語言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來了許多不便,尤其對(duì)初學(xué)C語言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤2013-07-07C++實(shí)現(xiàn)DES加密算法實(shí)例解析
這篇文章主要介紹了C++實(shí)現(xiàn)DES加密算法實(shí)例解析,是一個(gè)很實(shí)用的功能,需要的朋友可以參考下2014-08-08