图像仿射变换matlab,图像的仿射变换原理和实现
图像的仿射变换原理和实现
发布时间:2018-05-06 01:03,
浏览次数:1148
仿射变换能够保持图像的“平直性”,包括旋转,缩放,平移,错切操作。一般而言,仿射变换矩阵为2*3的矩阵,第三列的元素起着平移的作用,前面两列的数字对角线上是缩放,其余为旋转或者错切的作用。透视变换原理及实现请看我
下篇博客 。
设仿射变换矩阵T = [a11,a12,a13 ; a21,a22,a23]; 图像上fixed points坐标为(Xk,Yk);moving
points坐标为(xk,yk),其中k=1,2,...,n。
为了求解该仿射变换矩阵T的6个未知参数,理论上至少需要6个方程联立求解,即需要3组点集对,n>=3,当n>3时用最小二乘法求解未知参数。并且这三组点不共线。
数学展开式如下图:
下面根据上面公式给出实现代码,图像使用最近邻插值。
%% 读取原图像 clear ; close all; src=rgb2gray(imread('lena.png')); imshow(src); %%
method1,用3组点集对图像进行仿射变换,调用matlab系统函数 fixedPoints = [1,1; 1,100;100,100];
movingPoints = [20,20; 120,80; 160,200]; tic; tform =
fitgeotrans(movingPoints,fixedPoints,'affine'); dst_img = imwarp(src,tform);
t_sys = toc; figure;imshowpair(src,dst_img,'montage');
title(['系统函数的仿射变换图像,耗时(s):',num2str(t_sys)]) %% method2,用3组点集对图像进行仿射变换,解方程求变换矩阵
% T = [a11,a12,a13;a21,a22,a33]; % 满足fixed_pt_matrix = T*moving_pt_matrix; tic;
fixed_pt_matrix = fixedPoints'; moving_pt_matrix =
[movingPoints';ones(1,size(movingPoints,1))]; T =
fixed_pt_matrix/moving_pt_matrix; width = size(src,2); height = size(src,1);
[moving_pt_x,moving_pt_y] = meshgrid(1:width,1:height); coridate_affine =
T*[moving_pt_x(:)';% 对原来图像所有坐标点变换到新平面上 moving_pt_y(:)'; ones(1,width*height)];
x_temp = coridate_affine(1,:); y_temp = coridate_affine(2,:); fixed_pt_x =
reshape(x_temp,... size(moving_pt_x))+... abs(min(x_temp))+1; fixed_pt_y =
reshape(y_temp,... size(moving_pt_y))+... abs(min(y_temp))+1; fixed_pt_x =
round(fixed_pt_x); fixed_pt_y = round(fixed_pt_y); dst_affine_img =
zeros(round(max(y_temp)-min(y_temp))+1,... round(max(x_temp)-min(x_temp))+1);
for i = 1:height for j = 1:width
dst_affine_img(fixed_pt_y(i,j),fixed_pt_x(i,j)) = src(i,j); end end t_manual =
toc; figure;imshowpair(src,uint8(dst_affine_img),'montage');
title(['计算的仿射变换图像,耗时(s):',num2str(t_manual)]) %% 插值处理 [index_i,index_j] =
find(dst_affine_img); for i = 1:size(dst_affine_img,1) for j =
1:size(dst_affine_img,2) [min_distance,index_near] =
min(sqrt((i-index_i).^2+(j-index_j).^2)); if dst_affine_img(i,j)==0 &&
min_distance<=1 dst_affine_img(i,j) =
dst_affine_img(index_i(index_near),index_j(index_near)); end end end figure;
imshowpair(src,uint8(dst_affine_img),'montage'); title('插值后图像')
再看一个对点集的简单测试,T = [1,1,0;2,1,0];
%% 坐标点的仿射变换 [pt_x,pt_y] = meshgrid(1:10); pt_x = pt_x(:); pt_y = pt_y(:);
figure;subplot(211);plot(pt_x,pt_y,'ro');grid on; title('原始点集') dst_pt =
zeros(length(pt_x),2); tf_affine = [1,1,0;2,1,0]; for i = 1:length(pt_x) dst =
tf_affine*[pt_x(i),pt_y(i),1]'; dst_pt(i,:) = [dst(1),dst(2)]; end
subplot(212);plot(dst_pt(:,1),dst_pt(:,2),'bo');grid on title('仿射后点集')reference:
https://ww2.mathworks.cn/help/images/ref/fitgeotrans.html?s_tid=srchtitle
图像仿射变换matlab,图像的仿射变换原理和实现相关推荐
- cdd 变分 图像修复 matlab,图像修复中的TV模型
前言:图像修复是一项非常有意义的研究工作,比如我们生活中的照片被污染,再比如名贵字画.国家文物壁画等珍贵物品被破坏,这些都需要图像修复工作来完成. 简介:整体变分(Total Variation)的方 ...
- 非负矩阵图像融合MATLAB,图像融合的非负矩阵分解算法
第 17 卷 第 9 期 2005 年 9 月 计算机辅助设计与图形学学报 JOURNAL OF COMPUTER2AIDED DESIGN & COMPUTER GRAPHICS Vol17 ...
- OpenCV下三对点计算仿射变换实现图像的水平镜像(翻转)的详细说明和源程序
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像的仿射变换是指在空间直角坐标系中将一个二维坐 ...
- python图像处理(十)——图像仿射变换、图像透视变换和图像校正
一.图像仿射变换 1.原理 仿射变换(Affine Transformation 或Affine Map)是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,转换过程坐标点的相对位置和属性不发 ...
- 深度学习数据增强方法,利用仿射变换实现图像进行各种操作如平移、缩放、旋转、翻转
导读 在深度学习的数据增强中,我们经常需要对图像进行各种增强操作如平移.缩放.旋转.翻转等,这些其实都是图像的仿射变换.通过本篇文章,你能够知道它们的实现原理以及如何应用它们.本文讲述如何通过仿射变换 ...
- 【Matlab 图像】滤波器原理使用及测试效果
滤波器使用及测试效果 滤波器1:低通滤波 原理 代码 效果 滤波器2:高斯平滑 原理 代码 效果 滤波器3:自适应中值滤波 原理 代码 效果 滤波器4:维纳滤波 原理 代码 效果 滤波器5:最大值滤波 ...
- [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- [MATLAB] 图像的插值算法1:MATLAB中的插值函数及其原理
MATLAB图像插值算法文章集: 插值函数及其原理 https://blog.csdn.net/Effend/article/details/82870144 最近邻插值 https://blog.c ...
- 【opencv_getRotationMatrix2D、warpAffine 仿射变换实现图像旋转缩放 】
文章目录 仿射变换的基本概念 几种常见的仿射变换形式: 进行仿射变换:warpAffine 函数 代码示例: 仿射变换的基本概念 仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其 ...
最新文章
- 新手UI设计师需要掌握的知识和技能
- vue-socket.io跨域问题的解决方法
- Oracle 查询当前日期
- JZOJ__Day 3:【NOIP普及模拟】排序(sort)
- 说说C语言运算符的“优先级”与“结合性”
- 数据结构-王道-绪论
- Vue + Nodejs + Express 解决跨域的问题
- 论文发表在什么期刊上_医学论文发表期刊论文范文
- Python多线程--互斥锁、死锁
- 鸿蒙济判法讲义,2020-02-09《薛兆丰经济学讲义》读书笔记
- 正则表达式小括号的多义性
- 哈希桶 entry_聊一聊面试常问的几大哈希算法问题,这些你都会了嘛??
- POJ 2367 Genealogical tree【拓扑排序】
- Linux使用ntpdate和ntpd进行时间同步
- 【STL源码剖析读书笔记】自己实现stack之MyStack(底层用MyList)
- c语言实训项目设计设计游戏,C语言实训三贪吃蛇游戏设计.doc
- 兄弟打印机内存已满清零方法_兄弟打印机打印时显示内存已满怎么办
- 神经+符号知识推理论文浅读4篇
- 「详解」torch.nn.Fold和torch.nn.Unfold操作
- access统计班级人数_[access查询]access查询分段统计人数