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 相关文章推荐
Python3遍历目录树实现方法
May 22 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
详解Python中的变量及其命名和打印
Mar 11 Python
如何通过Python实现标签云算法
Jul 02 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
详解Python3中的 input() 函数
Mar 18 Python
编写python代码实现简单抽奖器
Oct 20 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
用Python实现Newton插值法
Apr 17 Python
Python入门之使用pandas分析excel数据
May 12 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中文字母数字验证码实现代码
2008/04/25 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
考博专家推荐信模板
2013/12/02 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
文明班集体申报材料
2014/05/23 职场文书
2015年工会工作总结
2015/03/30 职场文书
详解python网络进程
2021/06/15 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python