matlab练习程序(透视变换)

2023-05-16


close all;
clc;
H=1;                        %索引pix中第一个元素,即高度
W=2;                        %索引pix中第二个元素,即宽度
left_right=0.3;               %抬起左边或右边时值为0-1之间,不抬起时为0
up_down=0;                %抬起上边或下边时值为0-1之间,不抬起时为0

img=imread('lena.jpg');       %这里v为原图像的高度,u为原图像的宽度
imshow(img);                    %这里y为变换后图像的高度,x为变换后图像的宽度
%img=flipud(img);           %注释掉为抬起下边,没注释掉为抬起上边
%img=fliplr(img);           %注释掉为抬起右边,没注释掉为抬起左边
[v u]=size(img);


a=1;b=up_down;c=0;
d=left_right;e=1;f=0;
g=up_down/v;h=left_right/u;i=1;
rot=[a b c;d e f;g h i];

pix1=[1 1 1]*rot./(g+h+i);                 %变换后图像左上点的坐标
pix2=[1 u 1]*rot./(g*v+h+i);               %变换后图像右上点的坐标
pix3=[v 1 1]*rot./(g+h*u+i);               %变换后图像左下点的坐标
pix4=[v u 1]*rot./(g*v+h*u+i);             %变换后图像右下点的坐标

height=round(max([abs(pix1(H)-pix3(H))+0.5 abs(pix2(H)-pix3(H))+0.5 ...
                  abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix4(H))+0.5]));     %变换后图像的高度

width=round(max([abs(pix1(W)-pix2(W))+0.5 abs(pix3(W)-pix2(W))+0.5 ...
                 abs(pix1(W)-pix4(W))+0.5 abs(pix3(W)-pix4(W))+0.5]));      %变换后图像的宽度
imgn=zeros(height,width);

delta_y=abs(min([pix1(H)-0.5 pix2(H)-0.5 pix3(H)-0.5 pix4(H)-0.5]));            %取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1(W)-0.5 pix2(W)-0.5 pix3(W)-0.5 pix4(W)-0.5]));            %取得x方向的负轴超出的偏移量

for y=1-floor(delta_y):height-floor(delta_y)
    for x=1-floor(delta_x):width-floor(delta_x)
        pix=[y x 1]/rot*(g*y+h*x+i);                                %用变换后图像的点的坐标去寻找原图像点的坐标,                                         
                                                            %否则有些变换后的图像的像素点无法完全填充
        if pix(H)>=0.5 && pix(W)>=0.5 && pix(H)<=v && pix(W)<=u
            imgn(y+floor(delta_y),x+floor(delta_x))=img(round(pix(H)),round(pix(W)));
        end   
        
    end
end
figure,imshow(uint8(imgn));

%%二次变换,暂时只想起来这种笨方法,一次变换好像没法进行透视变换
img=imgn;
[v u]=size(img);
a=1;b=-b/2;c=0;
d=-d/2;e=1;f=0;
g=0;h=0;i=1;
rot=[a b c;d e f;g h i];

pix1=[1 1 1]*rot./(g+h+i);                 %变换后图像左上点的坐标
pix2=[1 u 1]*rot./(g*v+h+i);               %变换后图像右上点的坐标
pix3=[v 1 1]*rot./(g+h*u+i);               %变换后图像左下点的坐标
pix4=[v u 1]*rot./(g*v+h*u+i);             %变换后图像右下点的坐标

height=round(max([abs(pix1(H)-pix3(H))+0.5 abs(pix2(H)-pix3(H))+0.5 ...
                  abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix4(H))+0.5]));     %变换后图像的高度

width=round(max([abs(pix1(W)-pix2(W))+0.5 abs(pix3(W)-pix2(W))+0.5 ...
                 abs(pix1(W)-pix4(W))+0.5 abs(pix3(W)-pix4(W))+0.5]));      %变换后图像的宽度
imgn=zeros(height,width);

delta_y=abs(min([pix1(H)-0.5 pix2(H)-0.5 pix3(H)-0.5 pix4(H)-0.5]));            %取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1(W)-0.5 pix2(W)-0.5 pix3(W)-0.5 pix4(W)-0.5]));            %取得x方向的负轴超出的偏移量

for y=1-floor(delta_y):height-floor(delta_y)
    for x=1-floor(delta_x):width-floor(delta_x)
        pix=[y x 1]/rot*(g*y+h*x+i);                                %用变换后图像的点的坐标去寻找原图像点的坐标,                                         
                                                            %否则有些变换后的图像的像素点无法完全填充
        if pix(H)>=0.5 && pix(W)>=0.5 && pix(H)<=v && pix(W)<=u
            imgn(y+floor(delta_y),x+floor(delta_x))=img(round(pix(H)),round(pix(W)));
        end   
        
    end
end
%imgn=flipud(imgn);             %注释掉为抬起下边,没注释掉为抬起上边
%imgn=fliplr(imgn);             %注释掉为抬起右边,没注释掉为抬起左边
figure,imshow(uint8(imgn));       

图片福利:

注:更好的实现在这里

参考网址:

1.http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/EPSRC_SSAZ/epsrc_ssaz.html

2.http://alumni.media.mit.edu/~cwren/interpolator/

3.http://www.robots.ox.ac.uk/~vgg/presentations/bmvc97/criminispaper/

转载于:https://www.cnblogs.com/tiandsp/archive/2012/04/11/2443058.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab练习程序(透视变换) 的相关文章

随机推荐

  • TortoiseSVN 忽略文件 忽略已提交文件

    主要以下两种情况 xff1a 1 首次提交就做好了忽略拦截 xff1a 项目首次提交到svn服务器的时候 xff0c 把该删的删了 xff0c 然后设置忽略规则 xff0c 就没问题了 2 提交一段时间忽然想忽略拦截 xff1a 经常碰到的
  • java里getter和setter的作用和区别是什么?

    java是典型的面向对象的编程语言 xff0c 面向对象三个特性 xff0c 继承性 xff0c 多态性 xff0c 封装性 xff0c 主要和封装性考虑 xff0c 类里面的变量不想设置成公共的类型 xff0c 但是还要给外部使用在这种实
  • FC金手指使用方法+大全

    一 文章来由 童年 小时候除了小霸王FC主机 xff0c 然后就是世嘉MD主机 xff0c 玩的好多啊 xff0c 但有些游戏一直没打穿留下遗憾 网上找金手指使用方法 xff0c 都真真假假 xff0c 鱼龙混杂 xff0c 试了很多终于得
  • shell根据关键字获取文件某一行的行号

    为什么80 的码农都做不了架构师 xff1f gt gt gt cat n 文件名 grep 39 关键字 39 awk 39 print 1 39 cat n是获取行号 xff0c 要是获取行内容 xff0c 去掉 n就可以了 转载于 h
  • VS Code编译支持C++11问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如果你正确配置了 xff0c 能正确编译c 43 43 xff0c 但是发现auto等一些关键词不能使用 xff0c 那么 xff0c 请尝试如下操作 xff1a 打开ta
  • word2007自动生成参考文献引用并且右上角标注

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在写毕业论文时 xff0c 总要处理四五十篇的参考文献的引用 xff0c 本文就介绍如何快捷自动生成参考文献引用 xff0c 同时实现参考文献右上角标注 打开需要排版的论文
  • matlab练习程序(随机粒子切换特效)

    视频制作软件中一般都会有相邻帧切换的特效 xff0c 我过去用过vagas好像就有很多切换特效 我想这个也算是其中一种吧 xff0c 虽然我不确定实际中到底有没有这种切换 实际上我只是下班后太无聊了 xff0c 写着玩的 xff0c 没什么
  • PyQt4(简单信号槽)

    import sys from PyQt4 import QtCore QtGui class myWidget QtGui QWidget def init self super myWidget self init self setWi
  • 模拟京东商城登陆HttpRequest

    利用Winform HttpRequest 模拟登陆京东商城 目前只获取订单信息 xff0c 可以获取图片等其他信息 1 using System 2 using System Collections Generic 3 using Sys
  • Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤

    转载自 http apps hi baidu com share detail 11192699 content Nginx介绍 xff1a Nginx 34 engine x 34 是一个高性能的 HTTP 和反向代理服务器 xff0c
  • 我所理解的人工智能

    很多人容易把人工智能理解为机器人 机器人是人工智能的一个实际体现 人工智能应用很广泛 下面我来谈谈我的理解 人工智能可分开理解为 人工 和 智能 xff0c 即人类创造出来的智能 xff0c 从广义上来讲只要人类创造出来 xff0c 能为人
  • [Oracle数据库] 存储过程出错 :PLS-00103: 出现符号 "("在需要下列之一时: := . ) , @...

    讨论原因之一 xff1a 我写的简单存储过程如下 xff1a create or replace procedure p c v date in varchar2 200 is t count number begin select cou
  • Android读写properties配置文件

    写这篇文章之前可以成功运行 文章后就各种找不到文件 所以并没有采用此种方式 后期完善 详见下篇解决方案 配置文件读取很容易 修改需要注意权限 比如assets目录下就不允许修改 配置文件的创建 New File 命名后选择propertie
  • el-select数据过多懒加载(loadmore)

    el select数据过多处理方式 在日常项目中el select组件的使用频率是非常之高的 当数据过多时渲染时间非常长 这里提供几个处理方式 远程搜索 组件提供了远程搜索方式 也就是按照你输入的结果匹配选项 官网提供了参考示例 这里不加赘
  • Node连接Mysql遇到的坑以及踩坑总结

    前段时间做的项目中 xff0c 要用到 express 43 mysql 先看看我最初的实现代码 xff1a var conn 61 mysql createConnection host 39 example org 39 user 39
  • Cisco交换机配置新手篇之端口配置

    上回跟大家介绍了 如何正确连接交换机 xff0c 今天用一些配置片段给大家介绍一下端口的配置 鉴于网上大多数配置事例都是show run出来的结果 不利于新手对命令配置过程的了解 xff0c 所以笔者将配置片段和注意的地方都注明了一下 xf
  • 批处理:FOR的参数/F之delims详解

    xff08 三 xff09 delims 61 符号集 分隔符 格式 xff1a FOR F 34 Delims 61 符号集 34 I IN Command1 DO Command2 用法 xff1a 一句话总结 xff1a 忽略分隔符
  • springboot 单元测试 指定启动类

    问题 在做单元测试时 xff0c 写了一个工具类 xff0c 用于注入spring的上下文 public class AppBeanUtil implements ApplicationContextAware private static
  • 多项式系数提取算法 c++

    bool isNumber char s if s gt 61 48 amp amp s lt 61 57 return true else return false bool isLetter char s if s gt 61 97 a
  • matlab练习程序(透视变换)

    close all clc H 61 1 索引pix中第一个元素 xff0c 即高度 W 61 2 索引pix中第二个元素 xff0c 即宽度 left right 61 0 3 抬起左边或右边时值为0 1 之间 xff0c 不抬起时为0