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.4中新引入的asyncio模块
Apr 08 Python
Python爬虫之模拟知乎登录的方法教程
May 25 Python
python下10个简单实例代码
Nov 15 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
详解Python 函数如何重载?
Apr 23 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
python实现动态创建类的方法分析
Jun 25 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
python中取整数的几种方法
Nov 07 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
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
javascript onmouseout 解决办法
2010/07/17 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
js实现登录验证码
2016/12/22 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python ip正则式
2009/05/07 Python
python中随机函数random用法实例
2015/04/30 Python
Python正则表达式使用范例分享
2016/12/04 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
三维科技面试题
2013/07/27 面试题
宿舍违规检讨书
2014/01/12 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
导游词之太原天龙山
2020/01/02 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python