matlab实现透视变换
这篇博客讲讲透视变换的原理和实现,透视变换也叫投影变换,仿射变换是透视变换的特例。主要是透视变换能保持“直线性”,即原图像里面的直线,经透视变换后仍为直线。下面给出数学推导:
透视变换矩阵变换公式为:
其中透视变换矩阵:
要移动的点,即源目标点为:
另外定点,即移动到的目标点为:
这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以Z, (X';Y';Z')表示图像上的点:
(X';Y';Z')是二维图像上的的位置左边,其中z=1,表示二维图像
令,展开上面公式,得到一个点的情况:
4个点可以得到8个方程,即可解出A。
下面代码是上面公式的具体实现,ginput(4)是根据4组点对获取的透视变换矩阵。
clear all;
close all;
clc;
f= imread('6.jpg');
imshow(f);
fprintf('Begin to choose the color chip')
choose=true;
while choose
imshow(f)
dot=ginput(4); %取四个点,依次是左上,左下,右下,右上
y=[dot(1,1),dot(2,1),dot(3,1),dot(4,1)]; %四个原顶点
x=[dot(1,2),dot(2,2),dot(3,2),dot(4,2)];
plot_x=[x,x(1)];
plot_y=[y,y(1)];
hold on
plot(plot_y,plot_x,'r','LineWidth',2)
hold off
fprintf('Do you satisfy the target you chosen ,press 0 to rechose or press anything else to go\n');
a=input('');
if a~=0
choose=false;
end
end
w=round(max(dot(:,1))-min(dot(:,1)));
h=round(max(dot(:,2))-min(dot(:,2)));
%从原四边形获得新矩形高
%这里是新的顶点,我取的矩形,也可以做成其他的形状
%大可以原图像是矩形,新图像是从dot中取得的点组成的任意四边形.:)
Y=[1,1,w,w];
X=[1,h,h,1];
B=[X(1),Y(1),X(2),Y(2),X(3),Y(3),X(4),Y(4)]'; %变换后的四个顶点,方程右边的值
%联立解方程组,方程的系数
A=[x(1),y(1),1,0,0,0,-X(1)*x(1),-X(1)*y(1);
0,0,0,x(1),y(1),1,-Y(1)*x(1),-Y(1)*y(1);
x(2),y(2),1,0,0,0,-X(2)*x(2),-X(2)*y(2);
0,0,0,x(2),y(2),1,-Y(2)*x(2),-Y(2)*y(2);
x(3),y(3),1,0,0,0,-X(3)*x(3),-X(3)*y(3);
0,0 ,0,x(3),y(3),1,-Y(3)*x(3),-Y(3)*y(3);
x(4),y(4),1,0,0,0,-X(4)*x(4),-X(4)*y(4);
0,0,0,x(4),y(4),1,-Y(4)*x(4),-Y(4)*y(4)];%求解变换矩阵的行列式
cut_picture=zeros(h,w);
OutPicture=zeros(h,w,3);
OutPicture=cast(OutPicture,'uint8');%类型变换为uint8
fa=inv(A)*B;
fa=reshape([fa;1],[3,3]);%fa即是变换矩阵
cut=zeros(h+1,w+1);
BW=roipoly(f,y,x);%生成所选中区域的二值化图像cut
[coordinate_x,coordinate_y]=find(BW==1);%获得选中区域的坐标位置
coordinate=[coordinate_x,coordinate_y,ones(length(coordinate_y),1)];%增加z=1值以便进行左边变换
cut=coordinate*fa;%进行坐标变化
cut(:,1)=cut(:,1)./cut(:,3);
cut(:,2)=cut(:,2)./cut(:,3);%获得图像上对应的x,y值
cut=floor(cut+eps);
cut(find(cut(:,1:2)==0))=1;%边界为零的点变为1,
cut_coordinate=cut(:,1:2);%获得变换后得坐标位置
for k=1:3
img=f(:,:,k);
for i=1:length(coordinate)
cut_picture(cut_coordinate(i,1),cut_coordinate(i,2))=img(coordinate(i,1),coordinate(i,2));
end%讲对应坐标的像素对应
cut_picture=cast(cut_picture,'uint8');
B=zeros(5,5);
D = padarray(cut_picture,[3 3],'replicate','both');%填充像素
for i=4:h+3
for j=4:w+3
if D(i,j)==0
no_zero=find(D(i-1:i+1,j-1:j+1)~=0);
[m,n]=size(no_zero);
if m~=0
B=D(i-1:i+1,j-1:j+1);
else
no_zero=find(D(i-2:i+2,j-2:j+2)~=0);
[m,n]=size(no_zero);
if m~=0
B=D(i-2:i+2,j-2:j+2);
else
no_zero=find(D(i-3:i+3,j-3:j+3)~=0);
B=D(i-3:i+3,j-3:j+3);
end%以上是对没有被填充的点进行处理
end
cut_picture2(i-3,j-3)=median(B(no_zero));%原没有被插值成功的像素点,以周围非零像素的中位数代替;
else
cut_picture2(i-3,j-3)=cut_picture(i-3,j-3);
end
end
end
OutPicture(:,:,k)=cut_picture2;
end%这里是对图像三通道进行处理的,便于得到彩色图像
imshow(OutPicture);
实现效果如下
经过变换后
matlab实现透视变换相关推荐
- matlab如何进对图像进行透视变换,在Matlab中实现透视变换的方法 | 学步园
透视变换在两幅图像中进行对应非常有用,看下面的两幅图 第一幅图是源图像,图中有五个点,分别是四个顶点和中间的一个点(对应目标图中的中心点) 第二幅图是目标图,包括与源图像中的五个点对应的五个点 下面就 ...
- Matlab 透视变换 原理及其代码实现
一.透视变换内涵 透视变换本质:将一个图像投影到新的视平面 透视变换思路: 将二维坐标系转换为三维坐标系. 将三维坐标系投影到新的二维坐标系. 该过程属于非线性变换过程,一个菱形在经过非线性变换后得到 ...
- matlab与逆透视变换,基于逆透视变换的车道线检测方法与流程
本发明属计算机视觉.图形处理技术领域,具体涉及一种通过照度不变及逆透视变换进行车道线快速鲁棒检测的方法. 背景技术: 车道线检测作为自动驾驶技术的第一个环节,能够有效感知车辆周围世界,并获取可行驶区域 ...
- matlab 图像透视变换矩阵,[转载]图像倾斜校正、透视变换 MATLAB
过去也写过透视变换,当时算法真是弱爆了,我竟然会通过两次变换.不过那引用的三篇文章都是非常好的文章,直到今天我才看明白.所谓的倾斜校正,一定要有标定点,将一个倾斜的矩形变为不倾斜的.因此可以从原四边形 ...
- Matlab透视变换
%% 透视正变换 clc;close all;clear; in=imread("PerspectiveTransformation.bmp");fixedPoints = [1, ...
- 透视变换 单应性矩阵怎么求 matlab,单应性(homography)变换的推导
矩阵的一个重要作用是将空间中的点变换到另一个空间中.这个作用在国内的<线性代数>教学中基本没有介绍.要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中 ...
- matlab练习程序(透视变换)
close all; clc; H=1; %索引pix中第一个元素,即高度 W=2; %索引pix中第二个元素,即宽度 left_right=0.3; %抬起左边或右边时值为0-1之间,不抬起时为0 ...
- matlab透视变换函数,逆透视变换matlab 代码
[实例简介] 逆透视变换详解 及 代码实现(二) 中的相关代码!! http://blog.csdn.net/yeyang911/article/details/51915348 轻松掌握逆透视变换! ...
- matlab如何进对图像进行透视变换,如何根据已知的内在和外在参数在Matlab中进行透视校正?...
对于那些在这么多个月后仍对此感兴趣的人,我的代码(http://www.csse.uwa.edu.au/~pk/research/matlabfns),尤其是homography2d.m函数 . 但是 ...
最新文章
- 数据oem 操作手册_海口电销外呼系统oem-河南爱聊科技
- React 父组件(hooks)调用子组件(calss)方法
- CodeIgniter中的FCKeditor的路径问题
- windows操作系统_windows操作系统如何格式化u盘【操作方法】
- C语言小知识---递归函数的使用
- jdbc mysql innodb 死锁 deadlock_Mysql InnoDB 数据更新/删除导致锁表
- Android获得全局进程信息以及进程使用的内存情况
- 多线程编程之优先级翻转问题
- Python实现B样条代码
- QT Creator 创建qrc文件和使用资源文件
- OpenFOAM提取等值面并计算面积
- xUtils框架t网络加载图片 结合SwipeRefreshLayou下拉刷新
- JSP报错 At least one JAR was scanned for TLDs yet contained no TLDs
- 2021南昌市地区高考成绩排名查询,2021南昌中小学国编成绩排名/分数线
- 港台明星们的生日大曝光
- CSS实现页脚始终在页面底部
- 小米域名拦截检测API接口
- 17joys用户管理功能-模型
- PostgreSQL 11 tpcc 测试(103万tpmC on ECS) - use sysbench-tpcc by Percona-Lab
- ISO20000 服务目录