本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下。他用的是opencv,我这里用的是matlab。

过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将一张图像贴到另一张图像上。

两个透视投影都需要先计算投影矩阵,倾斜校正那一篇是通过解线性方程组求的变换矩阵,而这一篇是通过奇异值分解求的变换矩阵。

为了对齐两张图像,还需要对投影后的图像做一次仿射变换,其实就是坐标平移。

这里做投影和仿射直接调用了matlab的系统函数,方便一些。

还是先介绍下如何投影吧:

比如我们解单应性方程组或奇异值分解得到了投影矩阵:

那么变换方程就可以写为:

其中,x,y为原图像像素坐标,X,Y为目标图像像素坐标。

做一些正反点匹配变换的时候我会用这个公式,不过大多数情况下在做图像投影的时候,我并不用上面的公式,而是用下面这个公式:

其中,x,y为原图像像素坐标,X,Y为目标图像像素坐标。

第一个公式计算后图像会出现空洞,第二个公式计算量明显变大了,各有利弊吧。

这么复杂的一个公式,我可推不出来,是用Mathematica推的,这个软件真是极大的提高了我的效率。

话说matlab应该也能推,不过matlab的符号计算毕竟不是强项,我也就没去了解matlab的这项功能。

看看效果吧。

原图:

广告牌:

结果:

matlab代码如下:

main.m

clear all;close all;clc;

img1=imread('lena.jpg');
[h1 w1]=size(img1);
mask=uint8(ones(h1,w1)); %二值模板,方便最后的合成 img2=imread('pai.jpg');
[h2 w2]=size(img2); imshow(img1);
figure;imshow(img2); p1=[,;w1,;,h1;w1,h1];
p2=ginput(); %依次点击公告牌左上、右上、左下、右下 T=calc_homography(p1,p2); %计算单应性矩阵
T=maketform('projective',T); %投影矩阵 [imgn X Y]=imtransform(img1,T); %投影
mask=imtransform(mask,T); T2=eye();
if X()>, T2(,)= X(); end
if Y()>, T2(,)= Y(); end
T2=maketform('affine',T2); %仿射矩阵 imgn=imtransform(imgn,T2,'XData',[ w2],'YData',[ h2]); %仿射
mask=imtransform(mask,T2,'XData',[ w2],'YData',[ h2]); img=img2.*(-mask)+imgn.*mask; %合成
figure;imshow(img,[])

calc_homography

function T = calc_homography(points1, points2)

    xaxb = points2(:,) .* points1(:,);
xayb = points2(:,) .* points1(:,);
yaxb = points2(:,) .* points1(:,);
yayb = points2(:,) .* points1(:,); A = zeros(size(points1, )*, );
A(::end,) = ;
A(::end,) = ;
A(::end,:) = points1;
A(::end,:) = points1;
A(::end,) = -xaxb;
A(::end,) = -xayb;
A(::end,) = -yaxb;
A(::end,) = -yayb;
A(::end,) = -points2(:,);
A(::end,) = -points2(:,); [junk1,junk2,V] = svd(A);
h = V(:,) ./ V(,);
T= reshape(h,,);
end

matlab练习程序(透视投影,把lena贴到billboard上)的更多相关文章

  1. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  2. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  3. 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

    今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...

  4. 微信小程序开发之 下拉刷新,上拉加载更多

    本文记载了如何在微信小程序里面实现下拉刷新,上拉加载更多 先开看一下界面 大致如此的界面吧. 这个Demo使用了微信的几个Api和事件,我先列出来. 1.wx.request (获取远程服务器的数据, ...

  5. 程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板

    程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板 Web 开发中几乎的平台都需要一个后台管理,但是从零开发一套后台控制面板并不容易,幸运的是有很多开源免费的后台控制面板可以给开发者 ...

  6. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)

    ------------------------------ 无法连接到 IFCA-LIUWEI/SQL2005. ------------------------------其他信息: 已成功与服务 ...

  7. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)

    当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作  把url中的图片文件下载到本地(或者上传到私有云中)  public String uploadUrlToOss ...

  8. sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误。(provider:命名管道提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233) 然后再连接:错误:18456

    问题:sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误.(provider:命名管道提供程序,error:0-管道的另一端上无任何进程.)(Microsoft S ...

  9. 在向server发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的还有一端上无不论什么进程。

    作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/36425825 SQL Server 2008 + VS2010 用C#编写的代 ...

随机推荐

  1. 调用MySql 分页存储过程带有输入输出参数

    Create PROCEDURE getuser ( IN pageIndex INT, IN pageSize INT, OUT count INT ) BEGIN )*pageSize; sele ...

  2. IE7下,input元素相对父级元素错位解决办法

    原因: 当input仅仅包含父元素,父元素拥有margin属性时,IE7的input就会错误的继承margin属性. 解决办法: 给input元素外面套一个span,label这样的内联元素,这样就会 ...

  3. JAVA 利用JNI加密class文件/自定义ClassLoader 类

    利用 JNI 对bytecode 加密.不影响java程序员的正常开发.09年的时候写的,现在拿出来晒晒————————————————————————————混淆才是王道,如果混淆再加密就更酷了.. ...

  4. LiLinux系统下如何修改主机名

    1,用root用户登录,或者切换root用户,先查看当前的主机名:hostname  (如果之前没有修改过,一般默认为localhost.localdomain): 2,vi /etc/sysconf ...

  5. 搜狗2013年校园招聘研发类笔试试卷之C/C++类

    今天无聊在网上搜了下今年各大NB IT公司的笔试题,搜到了搜狗的,只有扫描版的试卷没有电子版也没有答案,就拿来做了做,题目非常多,涉及到C/C++.Java.数据结构.Android.IOS.Java ...

  6. 他们在军训,我在搞 OI(二)

    Day 2 7:26 2016/8/25 新的一天又开始了! 走在上学的路上,抬头看看北京少有的蓝天,太阳的威力不再那么明显,甚至输给了挡住它的云朵.迎面吹来了凉爽的风,夏天的燥热,早已无影无踪. 许 ...

  7. linux下软件安装的方法

    linux下软件的安装与卸载   第一章   linux下安装软件,如何知道软件安装位置 注:一般的软件的默认安装目录在 jdk-1_6_0_14-linux-i586-rpm.bin    ←修改为 ...

  8. http://www.zhihu.com/question/24896283

    http://www.zhihu.com/question/24896283 Rix Tox,太不專業了 三百.知乎用户.raintorr 等人赞同 1. 更改变量名的几种方法这种情况下该如何快速选中 ...

  9. 【Hibernate】Hibernate系列4之配置文件详解

    映射文件详解 4.1.概述 4.2.主键生成策略 4.3.属性配置 准确映射: 4.4.映射组成关系 4.5.单向多对一映射 4.6.双向多对一关系 4.7.一对一关联关系-基于外键映射 一对一联合m ...

  10. PYTHON实现HTTP基本认证(BASIC AUTHENTICATION)

    参考: http://www.voidspace.org.uk/python/articles/authentication.shtml#id20 http://zh.wikipedia.org/wi ...