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 相关文章推荐
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
Python Flask框架模板操作实例分析
May 03 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
python中get和post有什么区别
Jun 19 Python
Python无损压缩图片的示例代码
Aug 06 Python
python 自动识别并连接串口的实现
Jan 19 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给数组赋值的实例方法
2019/09/26 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解Django框架中的视图级缓存
2015/07/23 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
Python处理CSV与List的转换方法
2018/04/19 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
python实现扫雷游戏的示例
2020/10/20 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
自我鉴定范文
2013/11/10 职场文书
自我鉴定怎么写
2014/01/12 职场文书
会计电算化专业求职信
2014/06/10 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
高中班主任寄语
2019/06/21 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
python flask框架快速入门
2021/05/14 Python