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操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
python保存网页图片到本地的方法
Jul 24 Python
详解Python字典的操作
Mar 04 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
Python爬取某拍短视频
Jun 11 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 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上传、管理照片示例
2006/10/09 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
python目录与文件名操作例子
2016/08/28 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Python检查ping终端的方法
2019/01/26 Python
python顺序执行多个py文件的方法
2019/06/29 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Django REST 异常处理详解
2020/07/15 Python
Python 中如何写注释
2020/08/28 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
文职个人求职信范文
2013/09/23 职场文书
工作会议主持词
2014/03/17 职场文书
房产代理公证处委托书
2014/04/04 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
浅谈Python数学建模之固定费用问题
2021/06/23 Python