利用Matlab一鍵生成工地海報特效
1.使用效果


這篇的本質(zhì)還是扭曲置換,其實看過前面幾篇文章的應(yīng)該都能猜出是怎樣做到的,下面開始講解:
2.圖片準備和導(dǎo)入
首先m文件所在文件夾內(nèi)應(yīng)該有如下兩張圖:


此外還需要一張近似方形的圖片也要一起放在文件夾中,之后通過以下代碼導(dǎo)入和初步處理圖片(選擇幕布部分和去色代碼,可左右滑動):
bkgPic=imread('bkg.jpg'); % 背景圖
screenPic=bkgPic(190:555,(190:555)+160,:);% 幕布區(qū)域圖片
grayscreenPic=rgb2gray(screenPic); % 灰度化幕布區(qū)域圖片
screenRange=imread('screenRange.jpg'); % 幕布范圍圖(用來扣幕布邊緣細節(jié))
screenRange=rgb2gray(screenRange);
forePic=imread('2048.jpg'); % 要做成海報的圖片
3.圖像傾斜
我們可以看出幕布是有些傾斜的,我們?yōu)榱俗寛D片和幕布更加貼近,我們將圖片進行傾斜處理并將其調(diào)整至與幕布區(qū)域相似的大小:
% 前景圖片變形============================================================= tform=affine2d([1 -0.02 0;-0.02 1 0; 0 0 1]); forePic=imwarp(forePic,tform); exforePic=imresize(forePic,size(grayscreenPic)+26);

4.扭曲置換
這部分參考之前布料貼圖的部分呀:

% 扭曲置換=================================================================
for i=1:size(grayscreenPic,1)
for j=1:size(grayscreenPic,2)
goffset=(double(grayscreenPic(i,j))-128)/10;
offsetLim1=floor(goffset)+13;
offsetLim2=ceil(goffset)+13;
sep1=goffset-floor(goffset);
sep2=ceil(goffset)-goffset;
c1=double(exforePic(i+offsetLim1,j+offsetLim1,:));
c2=double(exforePic(i+offsetLim2,j+offsetLim2,:));
if sep1==0
c=double(exforePic(i+offsetLim1,j+offsetLim1,:));
else
c=c2.*sep1+c1.*sep2;
end
newforePic(i,j,:)=c;
end
end
5.正交疊底
% 正交疊底================================================================= newforePic=uint8((double(newforePic).*double(grayscreenPic))./220); % imshow(newforePic) % 舊版本的用下面這段代碼 % newforePicR=double(newforePic(:,:,1)).*double(grayscreenPic)./220; % newforePicG=double(newforePic(:,:,2)).*double(grayscreenPic)./220; % newforePicB=double(newforePic(:,:,3)).*double(grayscreenPic)./220; % newforePic(:,:,1)=newforePicR; % newforePic(:,:,2)=newforePicG; % newforePic(:,:,3)=newforePicB; % newforePic=uint8(newforePic);

6.緣修整(摳圖)
上方正交疊底后,幕布外面還是灰色,而且幕布內(nèi)容部分超出幕布范圍,我們可以用幕布范圍圖修整幕布:
% 邊緣修整================================================================= screenPicR=screenPic(:,:,1);newforePicR=newforePic(:,:,1); screenPicG=screenPic(:,:,2);newforePicG=newforePic(:,:,2); screenPicB=screenPic(:,:,3);newforePicB=newforePic(:,:,3); screenPicR(screenRange>20)=newforePicR(screenRange>20); screenPicG(screenRange>20)=newforePicG(screenRange>20); screenPicB(screenRange>20)=newforePicB(screenRange>20); screenPic(:,:,1)=screenPicR; screenPic(:,:,2)=screenPicG; screenPic(:,:,3)=screenPicB; screenPic=uint8(screenPic);

7.背景圖像替換
% 將背景圖幕布區(qū)域換為新圖================================================= bkgPic(190:555,(190:555)+160,:)=screenPic; imshow(bkgPic)

8.完整代碼
function consPoster
bkgPic=imread('bkg.jpg'); % 背景圖
screenPic=bkgPic(190:555,(190:555)+160,:);% 幕布區(qū)域圖片
grayscreenPic=rgb2gray(screenPic); % 灰度化幕布區(qū)域圖片
screenRange=imread('screenRange.jpg'); % 幕布范圍圖(用來扣幕布邊緣細節(jié))
screenRange=rgb2gray(screenRange);
forePic=imread('2048.jpg'); % 要做成海報的圖片
% 前景圖片變形=============================================================
tform=affine2d([1 -0.02 0;-0.02 1 0; 0 0 1]);
forePic=imwarp(forePic,tform);
exforePic=imresize(forePic,size(grayscreenPic)+26);
% 扭曲置換=================================================================
for i=1:size(grayscreenPic,1)
for j=1:size(grayscreenPic,2)
goffset=(double(grayscreenPic(i,j))-128)/10;
offsetLim1=floor(goffset)+13;
offsetLim2=ceil(goffset)+13;
sep1=goffset-floor(goffset);
sep2=ceil(goffset)-goffset;
c1=double(exforePic(i+offsetLim1,j+offsetLim1,:));
c2=double(exforePic(i+offsetLim2,j+offsetLim2,:));
if sep1==0
c=double(exforePic(i+offsetLim1,j+offsetLim1,:));
else
c=c2.*sep1+c1.*sep2;
end
newforePic(i,j,:)=c;
end
end
% 正交疊底=================================================================
newforePic=uint8((double(newforePic).*double(grayscreenPic))./220);
% imshow(newforePic)
% 舊版本的用下面這段代碼
% newforePicR=double(newforePic(:,:,1)).*double(grayscreenPic)./220;
% newforePicG=double(newforePic(:,:,2)).*double(grayscreenPic)./220;
% newforePicB=double(newforePic(:,:,3)).*double(grayscreenPic)./220;
% newforePic(:,:,1)=newforePicR;
% newforePic(:,:,2)=newforePicG;
% newforePic(:,:,3)=newforePicB;
% newforePic=uint8(newforePic);
% 邊緣修整=================================================================
screenPicR=screenPic(:,:,1);newforePicR=newforePic(:,:,1);
screenPicG=screenPic(:,:,2);newforePicG=newforePic(:,:,2);
screenPicB=screenPic(:,:,3);newforePicB=newforePic(:,:,3);
screenPicR(screenRange>20)=newforePicR(screenRange>20);
screenPicG(screenRange>20)=newforePicG(screenRange>20);
screenPicB(screenRange>20)=newforePicB(screenRange>20);
screenPic(:,:,1)=screenPicR;
screenPic(:,:,2)=screenPicG;
screenPic(:,:,3)=screenPicB;
screenPic=uint8(screenPic);
% imshow(screenPic)
% 將背景圖幕布區(qū)域換為新圖=================================================
bkgPic(190:555,(190:555)+160,:)=screenPic;
imshow(bkgPic)
end


以上就是利用Matlab一鍵生成工地海報特效的詳細內(nèi)容,更多關(guān)于Matlab海報特效的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++中常見容器類的使用方法詳解(vector/deque/map/set)
C++中常見的容器類有vector、list、deque、map、set、unordered_map和unordered_set。下面將舉例直接說明各個容器的使用方法,希望對大家有所幫助2023-03-03
關(guān)于C語言函數(shù)strstr()的分析以及實現(xiàn)
以下是對C語言中strstr()函數(shù)的使用進行了詳細的分析介紹,需要的朋友可以參考下2013-07-07
用C語言舉例講解數(shù)據(jù)結(jié)構(gòu)中的算法復(fù)雜度結(jié)與順序表
這篇文章主要介紹了講解數(shù)據(jù)結(jié)構(gòu)中的算法復(fù)雜度結(jié)與順序表的C語言版示例,包括對時間復(fù)雜度和空間復(fù)雜度等概念的簡單講解,需要的朋友可以參考下2016-02-02
詳解C語言整數(shù)和浮點數(shù)在內(nèi)存中的存儲
這篇文章主要介紹了C語言整數(shù)和浮點數(shù)在內(nèi)存中是如何存儲的,文中有詳細的代碼示例供大家參考,對大家了解學(xué)習(xí)C語言整數(shù)和浮點數(shù)在內(nèi)存中的存儲有一定的幫助,需要的朋友可以參考下2024-03-03
c語言中位字段與結(jié)構(gòu)聯(lián)合的組合使用詳解
本篇文章是對c語言中位字段與結(jié)構(gòu)聯(lián)合的組合使用進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C語言內(nèi)存函數(shù)的使用及其模擬實現(xiàn)
這篇文章主要介紹了C語言內(nèi)存函數(shù)的使用及其模擬實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10

