您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何使用Matlab繪制超絢麗的煙花效果,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
我們要構造一個黑色背景,對其添加高斯噪聲,然后依據閾值刪掉部分噪聲,生成一張隨機點圖片:
% 構造黑色背景并生成白色雜點 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); % 風特效構造函數 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
% 極坐標變換 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
我們發現煙花圖片中心區域方格化嚴重:
我們很容易想到圖像模糊,但是模糊后亮度又不夠,因此我們再做一次映射將圖片整體亮度提高:
模糊及映射:
% 模糊以減少像素化 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 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
其他幾個顏色:
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];
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繪制超絢麗的煙花效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。