图像的仿射变换原理和实现

发布时间: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,图像的仿射变换原理和实现相关推荐

  1. cdd 变分 图像修复 matlab,图像修复中的TV模型

    前言:图像修复是一项非常有意义的研究工作,比如我们生活中的照片被污染,再比如名贵字画.国家文物壁画等珍贵物品被破坏,这些都需要图像修复工作来完成. 简介:整体变分(Total Variation)的方 ...

  2. 非负矩阵图像融合MATLAB,图像融合的非负矩阵分解算法

    第 17 卷 第 9 期 2005 年 9 月 计算机辅助设计与图形学学报 JOURNAL OF COMPUTER2AIDED DESIGN & COMPUTER GRAPHICS Vol17 ...

  3. OpenCV下三对点计算仿射变换实现图像的水平镜像(翻转)的详细说明和源程序

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像的仿射变换是指在空间直角坐标系中将一个二维坐 ...

  4. python图像处理(十)——图像仿射变换、图像透视变换和图像校正

    一.图像仿射变换 1.原理 仿射变换(Affine Transformation 或Affine Map)是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,转换过程坐标点的相对位置和属性不发 ...

  5. 深度学习数据增强方法,利用仿射变换实现图像进行各种操作如平移、缩放、旋转、翻转

    导读 在深度学习的数据增强中,我们经常需要对图像进行各种增强操作如平移.缩放.旋转.翻转等,这些其实都是图像的仿射变换.通过本篇文章,你能够知道它们的实现原理以及如何应用它们.本文讲述如何通过仿射变换 ...

  6. 【Matlab 图像】滤波器原理使用及测试效果

    滤波器使用及测试效果 滤波器1:低通滤波 原理 代码 效果 滤波器2:高斯平滑 原理 代码 效果 滤波器3:自适应中值滤波 原理 代码 效果 滤波器4:维纳滤波 原理 代码 效果 滤波器5:最大值滤波 ...

  7. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  8. [MATLAB] 图像的插值算法1:MATLAB中的插值函数及其原理

    MATLAB图像插值算法文章集: 插值函数及其原理 https://blog.csdn.net/Effend/article/details/82870144 最近邻插值 https://blog.c ...

  9. 【opencv_getRotationMatrix2D、warpAffine 仿射变换实现图像旋转缩放 】

    文章目录 仿射变换的基本概念 几种常见的仿射变换形式: 进行仿射变换:warpAffine 函数 代码示例: 仿射变换的基本概念 仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其 ...

最新文章

  1. 新手UI设计师需要掌握的知识和技能
  2. vue-socket.io跨域问题的解决方法
  3. Oracle 查询当前日期
  4. JZOJ__Day 3:【NOIP普及模拟】排序(sort)
  5. 说说C语言运算符的“优先级”与“结合性”
  6. 数据结构-王道-绪论
  7. Vue + Nodejs + Express 解决跨域的问题
  8. 论文发表在什么期刊上_医学论文发表期刊论文范文
  9. Python多线程--互斥锁、死锁
  10. 鸿蒙济判法讲义,2020-02-09《薛兆丰经济学讲义》读书笔记
  11. 正则表达式小括号的多义性
  12. 哈希桶 entry_聊一聊面试常问的几大哈希算法问题,这些你都会了嘛??
  13. POJ 2367 Genealogical tree【拓扑排序】
  14. Linux使用ntpdate和ntpd进行时间同步
  15. 【STL源码剖析读书笔记】自己实现stack之MyStack(底层用MyList)
  16. c语言实训项目设计设计游戏,C语言实训三贪吃蛇游戏设计.doc
  17. 兄弟打印机内存已满清零方法_兄弟打印机打印时显示内存已满怎么办
  18. 神经+符号知识推理论文浅读4篇
  19. 「详解」torch.nn.Fold和torch.nn.Unfold操作
  20. access统计班级人数_[access查询]access查询分段统计人数

热门文章

  1. vue 美食杰 发布菜谱
  2. 虚拟机性能监控与故障处理工具
  3. 程序员找工作有哪些面试技巧
  4. 行业领先公司和软件系统
  5. python列表实现_Python列表去重如何实现?列表去重的4种方式
  6. Java基础学习之生产者消费者(29)
  7. Alphapose配置与运行中的问题
  8. ConfigurationManager
  9. 远程服务器ip地址可以更改吗,Web远程管理服务器端的IP地址如何进行设置?
  10. (精华)2020年8月17日 浏览器功能与组成