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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
python实现泊松图像融合
Jul 26 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
基于python实现音乐播放器代码实例
Jul 01 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
python中Mako库实例用法
Dec 31 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 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 class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
微信API接口大全
2015/04/15 PHP
PHP排序算法类实例
2015/06/17 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
Python实现图像几何变换
2015/07/06 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
使用Python pip怎么升级pip
2020/08/11 Python
Python 必须了解的5种高级特征
2020/09/10 Python
韩国11街:11STREET
2018/03/27 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
三行辞职书范文
2015/02/26 职场文书
经典爱情感言
2015/08/03 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书