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

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

服务器之家 - 编程语言 - C/C++ - 利用Matlab一键生成工地海报特效

利用Matlab一键生成工地海报特效

2022-11-01 15:30slandarer C/C++

这篇文章主要介绍了如何利用Matlab制作出工地海报的特效,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下

1.使用效果

利用Matlab一键生成工地海报特效

利用Matlab一键生成工地海报特效

这篇的本质还是扭曲置换,其实看过前面几篇文章的应该都能猜出是怎样做到的,下面开始讲解:

 

2.图片准备和导入

首先m文件所在文件夹内应该有如下两张图:

利用Matlab一键生成工地海报特效

利用Matlab一键生成工地海报特效

此外还需要一张近似方形的图片也要一起放在文件夹中,之后通过以下代码导入和初步处理图片(选择幕布部分和去色代码,可左右滑动):

bkgPic=imread('bkg.jpg');                 % 背景图
screenPic=bkgPic(190:555,(190:555)+160,:);% 幕布区域图片
grayscreenPic=rgb2gray(screenPic);        % 灰度化幕布区域图片

screenRange=imread('screenRange.jpg');    % 幕布范围图(用来扣幕布边缘细节)
screenRange=rgb2gray(screenRange);

forePic=imread('2048.jpg');               % 要做成海报的图片

利用Matlab一键生成工地海报特效

 

3.图像倾斜

我们可以看出幕布是有些倾斜的,我们为了让图片和幕布更加贴近,我们将图片进行倾斜处理并将其调整至与幕布区域相似的大小:

% 前景图片变形=============================================================
tform=affine2d([1 -0.02 0;-0.02 1 0; 0 0 1]);
forePic=imwarp(forePic,tform);
exforePic=imresize(forePic,size(grayscreenPic)+26);

利用Matlab一键生成工地海报特效

 

4.扭曲置换

这部分参考之前布料贴图的部分呀:

利用Matlab一键生成工地海报特效

% 扭曲置换=================================================================
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

利用Matlab一键生成工地海报特效

 

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

利用Matlab一键生成工地海报特效

 

6.缘修整(抠图)

上方正交叠底后,幕布外面还是灰色,而且幕布内容部分超出幕布范围,我们可以用幕布范围图修整幕布:

% 边缘修整=================================================================
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);

利用Matlab一键生成工地海报特效

 

7.背景图像替换

% 将背景图幕布区域换为新图=================================================
bkgPic(190:555,(190:555)+160,:)=screenPic;
imshow(bkgPic)

利用Matlab一键生成工地海报特效

 

8.完整代码

function consPoster
bkgPic=imread('bkg.jpg');                 % 背景图
screenPic=bkgPic(190:555,(190:555)+160,:);% 幕布区域图片
grayscreenPic=rgb2gray(screenPic);        % 灰度化幕布区域图片

screenRange=imread('screenRange.jpg');    % 幕布范围图(用来扣幕布边缘细节)
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)

% 将背景图幕布区域换为新图=================================================
bkgPic(190:555,(190:555)+160,:)=screenPic;
imshow(bkgPic)
end

利用Matlab一键生成工地海报特效

利用Matlab一键生成工地海报特效

利用Matlab一键生成工地海报特效

以上就是利用Matlab一键生成工地海报特效的详细内容,更多关于Matlab海报特效的资料请关注服务器之家其它相关文章!

原文链接:https://mp.weixin.qq.com/s/6iBbDY-bf8WQ8EBojWuypQ

延伸 · 阅读

精彩推荐
  • C/C++如何利用Emacs来调试C++程序

    如何利用Emacs来调试C++程序

    本文给大家分享的是使用编辑器中的神器Emacs来调试C++程序的方法,非常的细致全面,有需要的小伙伴可以参考下...

    C++教程网8412021-03-29
  • C/C++C++类与对象之运算符重载详解

    C++类与对象之运算符重载详解

    运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通...

    是我来晚了!7412022-01-24
  • C/C++C++ LARGE_INTEGER解析与使用案例详解

    C++ LARGE_INTEGER解析与使用案例详解

    这篇文章主要介绍了C++ LARGE_INTEGER解析与使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    零点零一11252021-12-24
  • C/C++C++中图片类型的识别与转换详解方法

    C++中图片类型的识别与转换详解方法

    本文简单的介绍一下C++语言中如何识别图片文件的类型,以及各图片类型之间的转换方法,并提供相关的源码供大家参考,感兴趣的朋友快来看看吧...

    link-初扬7892022-02-23
  • C/C++深入C++可见性与生命期的区别详解

    深入C++可见性与生命期的区别详解

    本篇文章对C++中可见性与生命期的区别进行了详细的分析介绍,需要的朋友参考下...

    C++教程网3242020-11-27
  • C/C++C语言超详细文件操作基础下篇

    C语言超详细文件操作基础下篇

    这篇文章主要为大家详细介绍了C语言的文件操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带...

    K稳重6072022-10-20
  • C/C++C语言函数栈帧详解

    C语言函数栈帧详解

    下面小编就为大家带来一篇浅谈C语言函数调用参数压栈的相关问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Zero0Tw05082022-01-24
  • C/C++C++实现简单的信息管理系统

    C++实现简单的信息管理系统

    这篇文章主要为大家介绍了C++实现简单的信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    仙桃李远航6392021-03-30