matlab练习程序(透视投影,把lena贴到billboard上)
本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下。他用的是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上)的更多相关文章
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- matlab练习程序(SUSAN检测)
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...
- 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行
今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...
- 微信小程序开发之 下拉刷新,上拉加载更多
本文记载了如何在微信小程序里面实现下拉刷新,上拉加载更多 先开看一下界面 大致如此的界面吧. 这个Demo使用了微信的几个Api和事件,我先列出来. 1.wx.request (获取远程服务器的数据, ...
- 程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板
程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板 Web 开发中几乎的平台都需要一个后台管理,但是从零开发一套后台控制面板并不容易,幸运的是有很多开源免费的后台控制面板可以给开发者 ...
- (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)
------------------------------ 无法连接到 IFCA-LIUWEI/SQL2005. ------------------------------其他信息: 已成功与服务 ...
- 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)
当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作 把url中的图片文件下载到本地(或者上传到私有云中) public String uploadUrlToOss ...
- sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误。(provider:命名管道提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233) 然后再连接:错误:18456
问题:sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误.(provider:命名管道提供程序,error:0-管道的另一端上无任何进程.)(Microsoft S ...
- 在向server发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的还有一端上无不论什么进程。
作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/36425825 SQL Server 2008 + VS2010 用C#编写的代 ...
随机推荐
- ASP.NET版Memcached监控工具(转载)
在上一篇文章<使用Memcached提高.NET应用程序的性能>中周公讲述如何在.NET中使用Memcached来提高.NET应用程序的性 能.在实际的使用中有可能出现Memcached因 ...
- 如何让ThinkPHP的模板引擎达到最佳效率
默认情况下ThinkPHP框架系统默认使用的模板引擎是内置模板引擎.内置模板引擎支持模板文件中采用php原生态代码和模板标签的混合使用.ThinkPHP官方开发文档说,这种默认的内置模板引擎的性能是高 ...
- LUA之string的使用
--string.len(s) --返回字符串s的长度 --string.rep(s, n)--返回重复n次字符串s的串,你使用string.rep("a", 2 ...
- Java中的构造函数和重载
一.Java中的构造函数 构造函数是对象被创建时初始化对象的成员方法,它具有和它所在的类完全一样的名字.构造函数只能有入口参数,没有返回类型,因为一个类的构造方法的返回类就是类本身.构造函数定义后,创 ...
- memcached工作原理
1.Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找.对比以及做到尽可能的散列.同时,memcached用的 ...
- MySQL数据库服务器的架设
导读 MySQL数据库是Linux操作系统上用得最多的数据库系统,它可以非常方便的与其它服务器集成在一起,如Apache.Vsftpd.Postfix等.下面介绍RHEL 6平台MySQL数据库服务器 ...
- Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏
著作权声明:本文由http://www.cnblogs.com/icker 原创,欢迎转载分享.转载时请保留该声明和作者博客链接,谢谢! 最近使用Unity3d制作的IOS游戏需要加入联网对战功能功能 ...
- nginx reload
iwangzheng.com Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives] Options:- ...
- 台大《机器学习基石》课程感受和总结---Part 2 (转)
转自:http://blog.sina.com.cn/s/blog_641289eb0101e2ld.html Part 2总结一下一个粗略的建模过程: 首先,弄清楚问题是什么,能不能用机器学习的思路 ...
- Coursera台大机器学习课程笔记15 -- Three Learning Principles
这节课是最后一节,讲的是做机器学习的三个原则. 第一个是Occan's razor,即越简单越好.接着解释了什么是简单的hypothesis,什么是简单的model.关于为什么越简单越好,林老师从大致 ...