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中__call__方法示例分析
Oct 11 Python
基于python的字节编译详解
Sep 20 Python
Python退火算法在高次方程的应用
Jul 26 Python
使用python3构建文件传输的方法
Feb 13 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
如何在mac版pycharm选择python版本
Jul 21 Python
java字符串格式化输出实例讲解
Jan 06 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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
PHP4中实现动态代理
2006/10/09 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
php加密解密字符串示例
2016/10/13 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
jQuery的deferred对象使用详解
2011/08/20 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
Python 基础教程之str和repr的详解
2017/08/20 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
高中毕业的自我鉴定
2013/12/09 职场文书
单位提档介绍信
2014/01/17 职场文书
旅游安全协议书
2014/04/21 职场文书
关于读书的活动方案
2014/08/14 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
2014年实验室工作总结
2014/12/03 职场文书
秦兵马俑导游词
2015/02/02 职场文书
街道社区活动报告
2015/02/05 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
建党伟业观后感
2015/06/01 职场文书
学习雷锋主题班会
2015/08/14 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
Redis分布式锁Redlock的实现
2021/08/07 Redis