zoukankan      html  css  js  c++  java
  • matlab练习程序(圆柱投影)

    圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出。

    投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了。

    这里就不写投影变换公式的推导过程了,直接给出变换公式。公式分为正变换和反变换,编程时,反变换公式通常更有用。

    正变换公式如下:

    其中,x,y为原图的坐标,x',y'为变换后图像的坐标,W,H为原图的宽和高,f=W/(2*tan(hfOV/2)),这里hfOV为相机水平视角,我们通过设置这个参数来实现不同的投影效果,hfOV取值为(0,pi)之间。

    反变换公式可以通过正变换公式推导出来,其实在程序中已经写出来了。

    下面是hfOV为pi/2时得到的变换结果:

    原图:

    处理后结果:

    matlab代码如下:

    clear all; close all;clc;
    
    img=imread('lena.jpg');
    [h,w]=size(img);
    
    hfOV=pi/2;     %可取区间为(0,pi)
    f=w/(2*tan(hfOV/2));
    
    newh=h;         %变换后高度不变
    neww=floor(f*atan((w-w/2)/f)+f*atan(w/(2*f)));  %通过正变换公式计算最大宽度
    imgn=zeros(newh,neww);
    
    for i=1:newh
        for j=1:neww
           
           %反变换公式的应用
           x=floor(f*tan(j/f-atan(w/(2*f)))+w/2);
           y=floor((i-h/2)*sqrt((x-w/2)^2+f^2)/f+h/2); 
            
             if x>=1 && x<=w && y>=1 && y<=h
                imgn(i,j)=img(y,x);
            end       
            
        end
    end
    
    imshow(img);
    figure;
    imshow(imgn,[]);
  • 相关阅读:
    redis报Cannot allocate memory错误
    Python输入输出
    leedcode题目 :罗马数字转整数 Java
    form 表单中input 使用disable属性
    今天开始学习
    equals的用法的注意事项
    mybatis的优缺点
    安装oracle出现环境不满足最低要求
    史上最形象易懂的java代理
    MySQL中光标的使用细节
  • 原文地址:https://www.cnblogs.com/tiandsp/p/3815119.html
Copyright © 2011-2022 走看看