溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Matlab制作環形相冊效果

發布時間:2022-03-06 14:10:40 來源:億速云 閱讀:806 作者:iii 欄目:開發技術

本篇內容主要講解“怎么用Matlab制作環形相冊效果”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Matlab制作環形相冊效果”吧!

    運行效果

    怎么用Matlab制作環形相冊效果

    怎么用Matlab制作環形相冊效果

    完整步驟

    1.圖片準備及導入

    要制作一款相冊足夠的圖片量是必不可少的,不然整個相冊只有一張圖來回重復多沒意思呀,因此我們需要一個文件夾專門放圖片,為了方便導入,這里全部都是jpg格式:

    怎么用Matlab制作環形相冊效果

    圖片導入代碼:

    path='.\album\';%文件夾路徑
    files=dir(fullfile(path,'*.jpg')); 
    picNum=size(files,1);
    
    %遍歷路徑下每一幅圖像
    for i=1:picNum
       fileName = strcat(path,files(i).name); 
       img = imread(fileName);
       imgSet.(['p',num2str(i)])=img;
    end

    2.為每張圖片制作遮罩層

    for i=1:length(BlockNum)%圓環層數
        blockNum=BlockNum(i);%每一層圖片數量
        Rrange=R(i,:);%每次一層半徑范圍
        for j=1:blockNum
            tempBoard=ones(2401,2401)==1;
            tempBoard=tempBoard&(disMesh>Rrange(1))&(disMesh<Rrange(2));
            tempBoard=tempBoard&(thetaMesh>((j-1)*2*pi/blockNum))&(thetaMesh<(j*2*pi/blockNum));
        end
    end

    就是依靠兩個判定條件來疊加來構造扇形結構:

    • 離中心點半徑處于[r,R]范圍內

    • 與x軸正半軸夾角處于[theta1,theta2]之間

    這是一個取交集的過程,圖片描述大概是下面這個樣子:

    怎么用Matlab制作環形相冊效果

    假設我們已構建好Xmesh,Ymesh矩陣

    [XMesh,YMesh]=meshgrid(-1200:1:1200,-1200:1:1200);

    距離矩陣:

    那么距離矩陣disMesh可以這樣構造:

    disMesh=sqrt(XMesh.^2+YMesh.^2);

    theta角矩陣:

    我們首先肯定能想到atan2,一個四象限反正弦函數,他的映射關系是這樣的:

    怎么用Matlab制作環形相冊效果

    是從z值范圍為-pi到pi,且是以x軸負半軸為0度角的,這里我們將其z值增加pi且將坐標軸翻轉,就能得到theta角矩陣:

    thetaMesh=atan2(YMesh,XMesh)+pi;
    thetaMesh=thetaMesh(:,end:-1:1);

    怎么用Matlab制作環形相冊效果

    更改后便是從x軸正半軸開始,映射范圍為[0,2*pi].

    3.調整每張圖大小

    我們找到每個蒙版x,y的范圍將其裁剪出來:

    怎么用Matlab制作環形相冊效果

    然后按照比例將原圖大小變換至至少有一個邊長與蒙版相等,另一邊長長于蒙版,然后截取圖片中心部分,代碼如下:

    for i=1:length(BlockNum)%圓環層數
        blockNum=BlockNum(i);%每一層圖片數量
        Rrange=R(i,:);%每一層半徑范圍
        for j=1:blockNum
            tempBoard=ones(2401,2401)==1;
            tempBoard=tempBoard&(disMesh>Rrange(1))&(disMesh<Rrange(2));
            tempBoard=tempBoard&(thetaMesh>((j-1)*2*pi/blockNum))&(thetaMesh<(j*2*pi/blockNum));
            TrueX=find(sum(tempBoard,1)>0);
            TrueY=find(sum(tempBoard,2)>0);
            tempMask=tempBoard(min(TrueY):max(TrueY),min(TrueX):max(TrueX));
            x1=YMesh(min(TrueX),min(TrueY));
            y1=XMesh(min(TrueX),min(TrueY));
            x2=YMesh(max(TrueX),max(TrueY));
            y2=XMesh(max(TrueX),max(TrueY));
            xdiff=x2-x1;
            ydiff=y2-y1;
            
            pic=imgSet.(['p',num2str(tempPic)]);
            [rows,cols,~]=size(pic);
            ratio=[ydiff+1,xdiff+1]./[rows,cols];
            newsize=ceil([rows,cols].*max(ratio));
            offset=floor((newsize-[ydiff+1,xdiff+1])./2);
            pic=imresize(pic,newsize);
            pic=pic((1:ydiff+1)+offset(1),(1:xdiff+1)+offset(2),:);
        end
    end

    4.繪圖及繪圖參數詳解

    基本參數:

    BlockNum=[7,11];%每層扇形數量
    R=[300,670;%第一層半徑范圍
    670,1090];%第二層半徑范圍
    lineColor=[0.98,0.98,0.98];線顏色
    lineWidth=2;%線粗細

    關于線的屬性之后再說

    繪圖就直接是用image函數,這個沒啥好說的,如果文件夾圖片不多我們會采用取余的方式循環畫之前的圖:

    tempPic=1;
    for i=1:length(BlockNum)
        blockNum=BlockNum(i);
        for j=1:blockNum
            tempPic=tempPic+1;
            tempPic=mod(tempPic-1,picNum)+1;
        end
    end

    我們發現直接繪圖的話邊緣鋸齒化比較嚴重:

    怎么用Matlab制作環形相冊效果

    我們很容易想到畫線來遮丑:

    t=0:0.001:(2*pi+0.001);
    for i=1:length(BlockNum)
        blockNum=BlockNum(i);
        Rrange=R(i,:);
        for j=1:blockNum
            plot(cos(j*2*pi/blockNum).*Rrange,sin(j*2*pi/blockNum).*Rrange,'Color',lineColor,'LineWidth',lineWidth)
        end
        plot(cos(t).*Rrange(1),sin(t).*Rrange(1),'Color',lineColor,'LineWidth',lineWidth)
        plot(cos(t).*Rrange(2),sin(t).*Rrange(2),'Color',lineColor,'LineWidth',lineWidth)
    end

    怎么用Matlab制作環形相冊效果

    當然也可以畫黑線:

    只需要lineColor=[0,0,0]或者lineColor='k&rsquo;即可

    怎么用Matlab制作環形相冊效果

    完整代碼

    function ringAlbum
    BlockNum=[7,11];
    R=[300,670;
       670,1090];
    lineColor=[0.98,0.98,0.98];
    lineWidth=2;
    
    path='.\album\';%文件夾名稱
    files=dir(fullfile(path,'*.jpg')); 
    picNum=size(files,1);
    
    %遍歷路徑下每一幅圖像
    for i=1:picNum
       fileName = strcat(path,files(i).name); 
       img = imread(fileName);
       imgSet.(['p',num2str(i)])=img;
    end
    
    fig=figure('units','pixels',...
            'position',[20 60 560 560],...
            'Color',[1 1 1]);
    ax=axes('Units','pixels',...
            'parent',fig,...  
            'Color',[1 1 1],...
            'Position',[0 0 560,560],...
            'XLim',[-1200,1200],...
            'YLim',[-1200,1200],...
            'XColor','none',...
            'YColor','none');
    hold(ax,'on')
    ax.YDir='reverse';
    ax.XDir='normal';
    
    
    
    [XMesh,YMesh]=meshgrid(-1200:1:1200,-1200:1:1200);
    disMesh=sqrt(XMesh.^2+YMesh.^2);
    thetaMesh=atan2(YMesh,XMesh)+pi;
    thetaMesh=thetaMesh(:,end:-1:1);
    
    tempPic=1;
    t=0:0.001:(2*pi+0.001);
    for i=1:length(BlockNum)
        blockNum=BlockNum(i);
        Rrange=R(i,:);
        for j=1:blockNum
            tempBoard=ones(2401,2401)==1;
            tempBoard=tempBoard&(disMesh>Rrange(1))&(disMesh<Rrange(2));
            tempBoard=tempBoard&(thetaMesh>((j-1)*2*pi/blockNum))&(thetaMesh<(j*2*pi/blockNum));
            TrueX=find(sum(tempBoard,1)>0);
            TrueY=find(sum(tempBoard,2)>0);
            tempMask=tempBoard(min(TrueY):max(TrueY),min(TrueX):max(TrueX));
            x1=YMesh(min(TrueX),min(TrueY));
            y1=XMesh(min(TrueX),min(TrueY));
            x2=YMesh(max(TrueX),max(TrueY));
            y2=XMesh(max(TrueX),max(TrueY));
            xdiff=x2-x1;
            ydiff=y2-y1;
            
            pic=imgSet.(['p',num2str(tempPic)]);
            [rows,cols,~]=size(pic);
            ratio=[ydiff+1,xdiff+1]./[rows,cols];
            newsize=ceil([rows,cols].*max(ratio));
            offset=floor((newsize-[ydiff+1,xdiff+1])./2);
            pic=imresize(pic,newsize);
            pic=pic((1:ydiff+1)+offset(1),(1:xdiff+1)+offset(2),:);
            
            image(ax,[x1,x2],[y1,y2],pic,'alphaData',tempMask);
            tempPic=tempPic+1;
            tempPic=mod(tempPic-1,picNum)+1;
        end
        for j=1:blockNum
            plot(cos(j*2*pi/blockNum).*Rrange,sin(j*2*pi/blockNum).*Rrange,'Color',lineColor,'LineWidth',lineWidth)
        end
        plot(cos(t).*Rrange(1),sin(t).*Rrange(1),'Color',lineColor,'LineWidth',lineWidth)
        plot(cos(t).*Rrange(2),sin(t).*Rrange(2),'Color',lineColor,'LineWidth',lineWidth)
    end
    
    end

    到此,相信大家對“怎么用Matlab制作環形相冊效果”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女