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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
python简单实现计算过期时间的方法
Jun 09 Python
Python 文件管理实例详解
Nov 10 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
python2 对excel表格操作完整示例
Feb 23 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 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
资料注册后发信小技巧
2006/10/09 PHP
PHP 选项及相关信息函数库
2006/12/04 PHP
php中的时间显示
2007/01/18 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
自写的一个jQuery圆角插件
2010/10/26 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
VsCode插件整理(小结)
2017/09/14 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
Python操作SQLite简明教程
2014/07/10 Python
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python递归全排列实现方法
2018/08/18 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
金智子午JAVA面试题
2015/09/04 面试题
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
2014年基建工作总结
2014/12/12 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书