写文章不易,如果您觉得此文对您有所帮助,请帮忙点赞、评论、收藏,感谢您!

一. 仿射变换介绍:

二. 仿射变换 公式:

仿射变换过程,(x,y)表示原图像中的坐标,(x',y')表示目标图像的坐标 ↑

三. 仿射变换——图像平移 算法:

仿射变换—图像平移算法,其中tx为在横轴上移动的距离,ty为在纵轴上移动的距离 ↑

四. python实现仿射变换——图像平移

import cv2

import numpy as np

# 图像仿射变换->图像平移

def affine(img, a, b, c, d, tx, ty):

H, W, C = img.shape

# temporary image

tem = img.copy()

img = np.zeros((H+2, W+2, C), dtype=np.float32)

img[1:H+1, 1:W+1] = tem

# get new image shape

H_new = np.round(H * d).astype(np.int)

W_new = np.round(W * a).astype(np.int)

out = np.zeros((H_new+1, W_new+1, C), dtype=np.float32)

# get position of new image

x_new = np.tile(np.arange(W_new), (H_new, 1))

y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)

# get position of original image by affine

adbc = a * d - b * c

x = np.round((d * x_new  - b * y_new) / adbc).astype(np.int) - tx + 1

y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1

# 避免目标图像对应的原图像中的坐标溢出

x = np.minimum(np.maximum(x, 0), W+1).astype(np.int)

y = np.minimum(np.maximum(y, 0), H+1).astype(np.int)

# assgin pixcel to new image

out[y_new, x_new] = img[y, x]

out = out[:H_new, :W_new]

out = out.astype(np.uint8)

return out

# Read image

image1 = cv2.imread("../paojie.jpg").astype(np.float32)

# Affine : 平移,tx(W向):向右30;ty(H向):向上100

out = affine(image1, a=1, b=0, c=0, d=1, tx=30, ty=-100)

# Save result

cv2.imshow("result", out)

cv2.imwrite("out.jpg", out)

cv2.waitKey(0)

cv2.destroyAllWindows()

五. 代码实现过程中遇到的问题:

① 原图像进行仿射变换时,原图像中的坐标可能超出了目标图像的边界,需要对原图像坐标进行截断处理。如何做呢?首先,计算目标图像坐标对应的原图像坐标,算法如下:

目标图像坐标反向求解原图像坐标公式 ↑

以下代码实现了该逆变换:

# get position of original image by affine

adbc = a * d - b * c

x = np.round((d * x_new  - b * y_new) / adbc).astype(np.int) - tx + 1

y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1

然后对原图像坐标中溢出的坐标进行截断处理(取边界值),下面代码提供了这个功能:

x = np.minimum(np.maximum(x, 0), W+1).astype(np.int)

y = np.minimum(np.maximum(y, 0), H+1).astype(np.int)

原图像范围:长W,高H

② 难点解答:

x_new = np.tile(np.arange(W_new), (H_new, 1))

y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)

x_new 矩阵横向长 W_new,纵向长H_new ↑

y_new 矩阵横向长 W_new,纵向长H_new ↑

造这两个矩阵是为了这一步:

# assgin pixcel to new image

out[y_new, x_new] = img[y, x]

六. 实验结果:

原图 ↑

仿射变换—图像平移后结果(向右30像素,向上100像素) ↑

七. 参考内容:

八. 版权声明:

未经作者允许,请勿随意转载抄袭,抄袭情节严重者,作者将考虑追究其法律责任,创作不易,感谢您的理解和配合!

python图像平移_仿射变换——图像平移 原理讲解及python实现相关推荐

  1. VTK修炼之道27:图像基本操作_三维图像切片交互提取(回调函数、观察者-命令模式)

    1.鼠标滑动提取三维图像切片 学习三维图像切面的提取后,我们可以实现一个稍微复杂的程序--通过滑动鼠标来切换三维图像切片,这也是医学图像处理软件中一个很基本的功能.实现该功能难点是怎样在VTK中控制鼠 ...

  2. python 可视化界面_给大家分享一些实用的Python库

    halo,大家好,我是特仑苏,今天给大家分享一些Python库,希望可以给大家带来一些用处! 原作者:http://itGap.ru 原出处:作品文(十大主要Python库)/网站名称(zen.yan ...

  3. 飞机大战--python基础项目(附源码和原理讲解)

    声明 此项目是对python基础语法和高级语法的结合,学完python基础和高级可以拿此项目练手,说的比较细,涵盖了pygame一些知识点的讲解. 项目展示 安装准备 这里我们要用到pygame模块, ...

  4. python ide 最好_我在iPad上最好的Python IDE

    python ide 最好 Having finished my first year at university, and being left with very little to do thi ...

  5. python换脸教程_教你如何用200行Python代码“换脸”教程

    原标题:教你如何用200行Python代码"换脸"教程 本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步 ...

  6. python 字符串拼接_面试官让用 3 种 python 方法实现字符串拼接 ?对不起我有8种……...

    点击上方 蓝字关注我们 点击上方"印象python",选择"星标"公众号重磅干货,第一时间送达!之前发过很多关于 Python 学习的文章,收到大家不少的好评, ...

  7. python selenium脚本_怎样开始写第一个基于python的selenium脚本

    1.下载并安装python(http://www.python.org/geti/). 2.安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩 ...

  8. python语言 行业_如何入门编程开发行业 选择Python语言怎么样

    如何入门编程开发行业?选择Python语言怎么样?Python是一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件,语法简洁清晰,它具有丰富和强大的库.它常被称为胶水语言,能够把用其他语言制作 ...

  9. python笔记视频_终于拿到!清华大佬Python视频+书+笔记汇总

    终于拿到!清华大佬Python视频+书+笔记汇总 清华学姐推荐的Python视频400集,拿走不谢!

  10. python 建筑计算_制图小技巧:巧用Python和ELK瞬间完成总图建筑名称标注

    哎呦,又到了每周一次的制图教室啦.经过前面两次制图教程的分享,相信大家对于白模填色和写实渲染这两种表达方式肯定有了较好的掌握. 那么今天我们就转战制图技巧篇,和童鞋们聊一下总平面图中的建筑名称标注问题 ...

最新文章

  1. 半个月两次投资,百度健康再扩服务版图
  2. 轻量级的web框架[Nancy On .Net Core Docker]
  3. python嵩天第二版第五章_如何避免从入门到放弃——python小组学习复盘
  4. typora代码块语言linux命令,typora工具的使用以及MarkDown语法
  5. Java基础知识汇总
  6. SVM多分类的几种方式
  7. web安全的一些专业术语介绍
  8. 计算机考试外贸出货单,史上最全订单跟进英文模板
  9. Java 框架、库和软件的精选列表(Awesome Java)
  10. Automation Anywhere, Blue Prism, UiPath, Pega, 码栈功能对比大全
  11. 2021年高压电工新版试题及高压电工模拟考试题
  12. MMO游戏服务器从零开发(架构篇)
  13. Spring包含JAR的详解
  14. Linux-vi/vim常用命令手册
  15. Mac的3个个性化设置,你值得拥有!
  16. xls和xlsx的区别
  17. 数据预处理 - 类型转换(离散型)
  18. ios 使用AVFoundation从视频中提取音频
  19. C#利用Microsoft.Office.Interop.Excel导出excel文件
  20. macd的python代码同花顺_手把手教你妙用MACD指标

热门文章

  1. 2, 世界上第一台电子数字计算机叫什么?它诞生在哪个国家?,世界上第一台电子数字,计算机叫什么名...
  2. java图形界面美化_在Java中使用图片实现GUI的美化.doc
  3. html手机分辨率选择,怎么看手机分辨率(手机屏幕分辨率多少才合适?)
  4. Java音乐播放:获取音频信息
  5. 收藏|史上最全最实用的运营工具库,你想要的都在!
  6. 北京航空航天大学公开课:拓扑学
  7. 解决MacBook无法读写移动硬盘的问题
  8. 分位数回归(quantile regression)简介和代码实现
  9. 计算机网络有个红叉怎么办,笔记本电脑右下角网络出现红叉的解决办法
  10. 什么是王道?什么是王道中的王道?