对图像块应用仿射变换,我们将其称为图像扭曲(或者仿射扭曲)。该操作不仅经常应用在计算机图形学中,而且经常出现在计算机视觉算法中。
一、仿射变换原理
仿射变换能够保持图像的“平直性”,包括旋转,缩放,平移,错切操作。对于三个点,仿射变换可以将一副图像进行扭曲,使得三对对应点对可以完美地匹配上。仿射变换具有6个自由度,有三个对应点对可以给出6个约束条件(对于这三个对应点对,x和y坐标必须都要匹配)
仿射变换是在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射。由一个非奇异的线性变换(运用一次函数进行的变换)接上一个平移变换组成。在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。

二、图像中的图像
仿射扭曲简单的一个例子是,将图像或者图像的一部分放置在另一幅图像中,使得它们能够和指定的区域或者标记物对齐。
以下是代码(代码参考同学博客 https://blog.csdn.net/weixin_43843780/article/details/88672426 ):

from PCV.geometry import warp, homography
from PIL import  Image
from pylab import *
from scipy import ndimage# 仿射扭曲im1到im2的例子im1 = array(Image.open('jida.jpg').convert('L'))
im2 = array(Image.open('beijing.jpg').convert('L'))
# 选定一些目标点
tp = array([[420,830,830,420],[400,350,1060,1000],[1,1,1,1]])
#标记物的坐标tp是用齐次坐标意义下的坐标表示的
#array为 第一张图片贴到第二张图片的四个角点的坐标
#tp = array([[675,826,826,677],[55,52,281,277],[1,1,1,1]])
im3 = warp.image_in_image(im1,im2,tp)
#image_in_image()函数的输入参数为两幅图像和一个坐标
figure()
gray()
subplot(141)
axis('off')
imshow(im1)
subplot(142)
axis('off')
imshow(im2)
subplot(143)
axis('off')
imshow(im3)# 选定im1角上的一些点
m,n = im1.shape[:2]
fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])
# 第一个三角形
tp2 = tp[:,:3]
fp2 = fp[:,:3]
# 计算H
H = homography.Haffine_from_points(tp2,fp2)
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])
# 三角形的alpha
alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
im3 = (1-alpha)*im2 + alpha*im1_t
# 第二个三角形
tp2 = tp[:,[0,2,3]]
fp2 = fp[:,[0,2,3]]
# 计算H
H = homography.Haffine_from_points(tp2,fp2)
#Haffine_from_points()返回给定对应点对的最优仿射变换
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])
# 三角形的alpha
alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
im4 = (1-alpha)*im3 + alpha*im1_t
subplot(144)
imshow(im4)
axis('off')
show()

实验运行结果:

在实验过程中,也出现了一些问题。
问题一:

为解决问题,先去PCV\PCV-master\PCV\geometry中找到wary.py和homegraphy.py文件,把print后面的语句都加上括号。但是在检查了好几遍括号以后,问题都没有解决,所以重装了一次pcv以后,异常就解决了。(重装pcv的方法在前面的博客有记录)

问题二:

因为是matplotlib发生了异常,所以我把matplotlib卸载了(在终端输入pip uninstall matplotlib),然后重装matplotlib,我在终端输入pip install matplotlib以后,安装无法成功,显示Could not install packages due to an EnvironmentError: [Errno 13] Permission denied。
这时候解决方法如下,输入:pip install matplotlib --user便可成功安装(注意:是有两个-)。


解决以上两个问题后,代码可正常运行。

Python计算机视觉 图像扭曲(仿射扭曲)相关推荐

  1. Python计算机视觉——图像到图像的映射

    Python计算机视觉--图像到图像的映射 文章目录 Python计算机视觉--图像到图像的映射 写在前面 1 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2 图像扭曲 2.1 图像中的图 ...

  2. Python计算机视觉——图像搜索

    文章目录 第七章--图像搜索 一.前期准备知识 1.基于内容的图像检索 2.视觉单词 二.图像搜索 流程1 流程2 流程3 三.使用几何特性对结果排序 第七章--图像搜索 主要内容:利用文本挖掘技术对 ...

  3. Python计算机视觉——图像内容分类

    文章目录 第八章 图像内容分类 (一)K邻近分类法(KNN) (二)贝叶斯分类器 (三)支持向量机 (四)光学字符识别 第八章 图像内容分类 本章介绍图像分类和图像内容分类算法. 先介绍一些简单而有效 ...

  4. 【python】图像映射:单应性变换与图像扭曲

    [python]图像映射:单应性变换与图像扭曲 单应性变换(Homography) 图像扭曲(仿射变换) 图中图 分段仿射扭曲 单应性变换(Homography) 单应性变换(Homography)即 ...

  5. python图像的几何运算_python中图像的几何扭曲

    我想用python对图像执行几何变换,沿着给定的曲线"拉直"或校正图像.似乎scikit图像ProjectiveTransform()和{}对于这一点非常好,但是文档很少.我遵循了 ...

  6. python计算机视觉学习第三章——图像到图像的映射

    目录 引言 一. 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 二. 图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.2 图像配准 三.创建全景图 3.1 RANSAC(随机一致性 ...

  7. Python计算机视觉编程学习笔记 三 图像到图像的映射

    图像到图像的映射 (一)单应性变换 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSAC 3.2 拼接图像 (一)单应性变换 单应性变换是将 ...

  8. Python计算机视觉编程第三章——图像到图像的映射

    Python计算机视觉编程 图像到图像的映射 (一)单应性变换 1.1 直接线性变换算法 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSA ...

  9. 三、【python计算机视觉编程】图像到图像的映射

    图像到图像的映射 (一)单应性变换 (1)直接线性变换算法(DLT) (2)仿射变换(affine) (二)图像扭曲 (1)图像中的图像 (2)分段仿射扭曲 (3)图像配准 (三)创建全景图 (1)R ...

  10. python计算机视觉编程——立体图像之计算视差图

    计算视差图 一.立体图像 1.1概念 1.2关于图像配准算法 二.立体重建之计算视差图 2.1归一化及算法概念 2.2匹配流程 三.实验测试 3.1实验要求 3.2实验代码 3.3实验结果分析 3.4 ...

最新文章

  1. 鸿蒙内核源码分析:调度机制篇
  2. youtube匹配channel(频道)
  3. 单片机用python还是c语言_单片机为什么一直用C语言,不用其他编程语言?
  4. [Luogu 3258] JLOI2014 松鼠的新家
  5. python bool值要注意的一些地方
  6. IDEA 安装JUnitGenerator V2.0 插件 帮助生成单元测试
  7. Catlyst 6509告警信息--把trunk口配置成access
  8. STM32CubeIDE 下载与安装步骤(一)
  9. python3 pyqt5 和eric5配置教程
  10. 项目管理工具一:职责清晰的6W1H原则
  11. python函数长度单位换算,(最新整理)长度单位换算
  12. 【天下有春】剑气纵横三万里,一剑光寒十九洲
  13. 生成彩色二维码(渐变色、插入图片和文字)
  14. java实现动态加载jar包中的class(破坏双亲委派来实现)
  15. 查询rssi指令_h3c无线控制器常用命令(wx)
  16. 2018年区块链红黑榜-千氪
  17. 【白帽子讲Web安全】第二章 浏览器安全
  18. 嵌入式ARM设计编程(一) 简单数据搬移
  19. 教你如何建立STM32F103通用工程模板(固件库)
  20. Windows 图形化界面子系统安装教程

热门文章

  1. Xcelsius 访问webservice 需要配置
  2. 服务机器人工程师(ROS)要求汇总220331
  3. SpringCloud-网关统一配置跨域
  4. linux动态库so更新
  5. 虚拟DOM和真实DOM
  6. python3 题解(33 人民币金额大写)
  7. 获利能力分析实际数据收集流程
  8. vue-admin-better前端页面-菜单-权限配置
  9. 不到两小时教会你用JAVA制作超级玛丽小游戏
  10. Markdown安装/破解/下载