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实现ipsec开权限实例
Nov 11 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
python3实现单目标粒子群算法
Nov 14 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Pycharm github配置实现过程图解
Oct 13 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 Python
基于Python实现一个春节倒计时脚本
Jan 22 Python
Python内置的数据类型及使用方法
Apr 13 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制作的简单验证码识别代码
2016/01/26 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
python Django的web开发实例(入门)
2019/07/31 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
企业总经理职责
2014/02/02 职场文书
社团活动总结范文
2014/04/26 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
销售人员求职信
2014/07/22 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技