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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
使用python3.5仿微软记事本notepad
Jun 15 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
python3中set(集合)的语法总结分享
Mar 24 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
python实现网页录音效果
Oct 26 Python
Python实现科学占卜 让视频自动打码
Apr 09 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
简单的Vue异步组件实例Demo
2017/12/27 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python中List的sort方法指南
2014/09/01 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
Python制作词云图代码实例
2019/09/09 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
python实现AdaBoost算法的示例
2020/10/03 Python
python的数学算法函数及公式用法
2020/11/18 Python
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
一套英文Java笔试题面试题
2016/04/21 面试题
个人简历的自荐信
2013/10/23 职场文书
日语专业毕业生自荐信
2013/11/11 职场文书
高中学生期末评语
2014/04/25 职场文书
合作协议书模板2014
2014/09/26 职场文书
财会专业大学生求职信
2014/09/26 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
写给导师的自荐信
2015/03/06 职场文书
大学生村官入党自传
2015/06/26 职场文书
导游词之吉林花园山
2019/10/17 职场文书
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android