Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)


Posted in Python onMay 13, 2019

前言

总结一下最近看的关于opencv图像几何变换的一些笔记.

这是原图:

Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

1.平移

import cv2
import numpy as np

img = cv2.imread("image0.jpg", 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]

dst = np.zeros(imgInfo, np.uint8)

for i in range( height ):
  for j in range( width - 100 ):
    dst[i, j + 100] = img[i, j]

cv2.imshow('image', dst)
cv2.waitKey(0)

demo很简单,就是将图像向右平移了100个像素.如图:

Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

2.镜像

import cv2
import numpy as np


img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]

dst = np.zeros([height*2, width, deep], np.uint8)

for i in range( height ):
  for j in range( width ):
    dst[i,j] = img[i,j]
    dst[height*2-i-1,j] = img[i,j]

for i in range(width):
  dst[height, i] = (0, 0, 255)
cv2.imshow('image', dst)
cv2.waitKey(0)

demo生成一个如下效果:

Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

3.缩放

import cv2
img = cv2.imread("image0.jpg", 1)
imgInfo = img.shape
print( imgInfo )
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]

# 1 放大 缩小 2 等比例 非等比例
dstHeight = int(height * 0.5)
dstWeight = int(width * 0.5)

# 最近邻域插值 双线性插值 像素关系重采样 立方插值
dst = cv2.resize(img, (dstWeight,dstHeight))
print(dst.shape)
cv2.imshow('image', dst)
cv2.waitKey(0)

使用resize直接进行缩放操作,同时还可以使用邻域插值法进行缩放,代码如下:

# 1 info 2 空白模板 3 重新计算x, y
import cv2
import numpy as np
img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape # 先高度,后宽度
height = imgInfo[0]
width = imgInfo[1]
dstHeight = int(height/2)
dstWidth = int(width/2)

dstImage = np.zeros([dstHeight, dstWidth, 3], np.uint8)
for i in range( dstHeight ):
  for j in range(dstWidth):
    iNew = i * ( height * 1.0 / dstHeight )
    jNew = j * ( width * 1.0 / dstWidth )

    dstImage[i,j] = img[int(iNew),int(jNew)]

cv2.imshow('image', dstImage)
cv2.waitKey(0)

4.旋转

import cv2

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]

# 定义一个旋转矩阵
matRotate = cv2.getRotationMatrix2D((height*0.5, width*0.5), 45, 0.7) # mat rotate 1 center 2 angle 3 缩放系数

dst = cv2.warpAffine(img, matRotate, (height, width))

cv2.imshow('image',dst)
cv2.waitKey(0)

旋转需要先定义一个旋转矩阵,cv2.getRotationMatrix2D(),参数1:需要旋转的中心点.参数2:需要旋转的角度.参数三:需要缩放的比例.效果如下图:

Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

5.仿射

import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
# src 3 -> dst 3 (左上角, 左下角,右上角)
matSrc = np.float32([[0,0],[0,height-1],[width-1, 0]]) # 需要注意的是 行列 和 坐标 是不一致的
matDst = np.float32([[50,50],[100, height-50],[width-200,100]])

matAffine = cv2.getAffineTransform(matSrc,matDst) #mat 1 src 2 dst 形成组合矩阵
dst = cv2.warpAffine(img, matAffine,(height, width))
cv2.imshow('image',dst)
cv2.waitKey(0)

需要确定图像矩阵的三个点坐标,及(左上角, 左下角,右上角).定义两个矩阵,matSrc 为原图的三个点坐标,matDst为进行仿射的三个点坐标,通过cv2.getAffineTransform()形成组合矩阵.效果如下:

Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python求最大连续子数组的和
Jul 07 Python
python 生成图形验证码的方法示例
Nov 11 Python
Java文件与类动手动脑实例详解
Nov 10 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
logging level级别介绍
Feb 21 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
python爬虫快速响应服务器的做法
Nov 24 Python
Python爬虫之Selenium库的使用方法
Jan 03 Python
Python 实现定积分与二重定积分的操作
May 26 Python
python ansible自动化运维工具执行流程
Jun 24 Python
Python中的 No Module named ***问题及解决
Jul 23 Python
Python 通过打码平台实现验证码的实现
May 13 #Python
利用python和百度地图API实现数据地图标注的方法
May 13 #Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 #Python
为什么你还不懂得怎么使用Python协程
May 13 #Python
Python玩转加密的技巧【推荐】
May 13 #Python
11个Python3字典内置方法大全与示例汇总
May 13 #Python
python中的数据结构比较
May 13 #Python
You might like
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
摘自启点的main.js
2008/04/20 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
javascript数组的使用
2013/03/28 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
python实时监控cpu小工具
2018/06/21 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
python列表返回重复数据的下标
2020/02/10 Python
Python bytes string相互转换过程解析
2020/03/05 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
python logging模块的使用
2020/09/07 Python
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
信息专业个人的自我评价
2013/12/27 职场文书
爱国演讲稿400字
2014/05/07 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
薪资证明范本
2015/06/19 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
辞职申请书范本
2019/05/20 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python