OpenCV:图片的几何变换
文章目录
- 1.图片缩放
- 1.1 最近邻域插值法
- 1.2 双线性插值法
- 2.图片剪切
- 3.图片位移
- 4.图片镜像
- 5.仿射变换
- 6.图像旋转
1.图片缩放
使用cv2.resize
方法进行图像的缩放
import cv2
img = cv2.imread('img.jpg', 1)
imgInfo = img.shape # 得到图片的高度、宽度、颜色通道
print(imgInfo)
height, width, mode = imgInfo
# 等比例缩放
datHeight = int(height * 0.5)
datWidth = int(width * 0.5)# 默认使用双线性差值算法进行缩放
dat = cv2.resize(img, (datWidth, datHeight))
cv2.imshow('image', dat)
cv2.waitKey(0)
(320, 320, 3)
1.1 最近邻域插值法
新的坐标计算公示如下:
newX = x * (src_rows / target_rows)
比如:现有坐标x(1, 2) src图像有100行,target图像有50行 newX = (1, 2) * 2 = (2, 4)
1.2 双线性插值法
现在我们有一个点x = (15.2, 22.3), 将这点投影到x轴和y轴,得到A1,A2,B1,B2四个点,我们通过比例来求得四个点的像素大小,如A1 = (15, 22.3), 则s(A1) = s(15, 22) * 20% + s(16, 22) * 80%
,其他四个点也是同样的计算道理,然后我们通过x点在A1和A2的比例或者B1和B2的比例来得到x点的像素值: x = s(A1)* 30% + s(A2) * %70
, 或者 x = s(B1) * 20% + s(B2) * 80%
图片缩放的基本步骤:
1.获取图片信息
2.创建空白模板
3.重新计算图像坐标
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
imgInfo = img.shape # 得到图片的高度、宽度、颜色通道
print(imgInfo)
height, width, mode = imgInfo
datHeight = int(height * 0.5)
datWidth = int(width * 0.5)
datImage = np.zeros((datHeight, datWidth, 3),np.uint8) # 创建空白模板for i in range(datHeight):for j in range(datWidth):iNew = int(i * height / datHeight)jNew = int(j * height / datHeight)datImage[i, j] = img[iNew, jNew]
cv2.imwrite('img1.jpg', datImage)
cv2.imshow('dat', datImage)
cv2.waitKey(0)
(320, 320, 3)
2.图片剪切
图片坐标轴:以左上角为原点,横轴为x轴,纵轴为y轴
import cv2
img = cv2.imread('img.jpg', 1)
imgInfo = img.shape
data = img[100:200, 100:300]# 设置纵轴为100-500, 横轴为100-1000
cv2.imshow('image', data)
cv2.waitKey(0)
3.图片位移
通过使用cv2.warpAffine
方法进行图片的位移
该函数的参数如下:
-src: 要进行位移的图像
-M: 变换矩阵
-dsize: 进行位移之后的图像大小
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]matShift = np.float32([[1, 0, 50], [0, 1, 100]])# 转换矩阵
dat = cv2.warpAffine(img, matShift, (height, width))
cv2.imshow('dat', dat)
cv2.waitKey(0)
计算过程如下:
1.将数组[[1, 0, 25], [0, 1, 50]]转化为俩个矩阵:[[1, 0], [0, 1]] -- A[[25], [50]] -- B
2.输入图片为C
3.对应每一个像素表坐标(x, y)计算新的像素坐标为:A * C + B = [[1 * x + 0 * y], [0 * x + 1 * y]] + [[25], [50]]= [[x + 25], [y + 50]]
我们来使用cv2.warpAffine方法将图片缩放0.5倍,只需要将A矩阵里的1换成0.5即可:
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]matScale = np.float32([[0.5, 0, 0], [0, 0.5, 0]])# 转换矩阵
dat = cv2.warpAffine(img, matScale, (int(width / 2), int(height / 2)))
cv2.imshow('dat', dat)
cv2.waitKey(0)
下面我们来使用源代码进行图片的位移
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('src', img)
dat = np.zeros(img.shape,np.uint8) # 创建空白模板
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for i in range(0, height):for j in range(0, width - 100):dat[i, j + 100] = img[i, j]
cv2.imshow('dat', dat)
cv2.waitKey(0)
4.图片镜像
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1) # 读取图片
cv2.imshow('src', img)
imgInfo = img.shape # 获得图片信息
height = imgInfo[0] # 高度
width = imgInfo[1] # 宽度
deep = imgInfo[2] # 颜色通道newImgInfo = (height * 2, width, deep) # 镜像图片信息
dat = np.zeros(newImgInfo,np.uint8) # 创建空白模板for i in range(0, height):for j in range(0, width):dat[i, j] = img[i, j]dat[2 * height - i - 1, j] = img[i, j]
#添加分割线
for i in range(0, width):dat[height, i] = (0, 0, 255) # BGR
cv2.imshow('dat', dat)
cv2.waitKey(0)
5.仿射变换
我们知道3点确定一个平面,仿射变换的原理就是利用原图像和目标图像三个点的位置关系,得到图像的仿射变换矩阵,从而实现将整个图像通过变换矩阵得到目标图像
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1) # 读取图片
cv2.imshow('src', img)
imgInfo = img.shape # 获得图片信息
height = imgInfo[0] # 高度
width = imgInfo[1] # 宽度
deep = imgInfo[2] # 颜色通道
# (左上角,左下角,右上角)
matSrc = np.float32([[0, 0], [0, height - 1], [width - 1, 0]])
matDst = np.float32([[50, 50], [100, height - 100], [width - 100, 100]])
# 得到仿射变换矩阵
matAffine = cv2.getAffineTransform(matSrc, matDst) # dst = cv2.warpAffine(img, matAffine, (height, width))
cv2.imshow('dst', dst)
cv2.waitKey(0)
6.图像旋转
我们使用cv2.getRotationMatrix2D
函数来进行图像的旋转
cv2.getRotationMatrix2D(cneter, angle, scale):
-center: 旋转的中心
-angle: 旋转的角度
-scale: 缩放系数
import cv2
import numpy as np
img = cv2.imread('img1.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.5)
dst = cv2.warpAffine(img, matRotate, (height, width))
cv2.imshow('dst', dst)
cv2.waitKey(0)
OpenCV:图片的几何变换相关推荐
- opencv图片线性混合可调
opencv图片线性混合叠加.addWeighted()函数 直接上效果图 通过滚动条选择不同的透明值,使得两张图片进行不同程度的线性混合. 主要的代码是这句:addWeighted()函数 //根据 ...
- 2020-12-03 Python OpenCV: 图片的裁剪
Python OpenCV: 图片的裁剪 图片裁剪使用img[y0:y1, x0:x1],其中参数分别代表y轴和x轴的起始坐标,具体使用方法如下: import cv2img = cv2.imread ...
- python+freetype+opencv 图片中文(汉字)显示 详细图文教程和项目完整源代码
opencv图片写入中文(汉字)有两方法: 方法一: python+opencv+freetype https://blog.csdn.net/wyx100/article/details/75579 ...
- opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍
本文来自于段力辉 译<OpenCV-Python 中文教程> 文章目录 一.图片 + 读入.显示.写出 1.cv2.imread() 2.cv2.imshow() 3.cv2.imwrit ...
- Pyhton opencv 图片裁剪
Pyhton opencv 图片裁剪 opencv中可以通过 imread,imwrite进行图片读取和保存,imread读取图片后可以通过长度高度进行图片的裁剪 从上面图片可以得到,对角坐标是(x1 ...
- Python OpenCV 图片滑块验证码 滑块图片验证码 快速自动识别方案 代码简单 模板匹配识别 识别成功率达90%+
前言 通过上一篇的文章大家已经对图片滑块验证码已经有了初步的了解,图片滑块验证码的核心关键在于图片识别接下来接入讲解.因为初版滑块图片识别虽然能识别验证码,通过一些策略调整也相对提高了一些图片识别率, ...
- 三:OpenCV图片颜色通道数据转换
对图片进行操作时经常会涉及到不同通道数据提取,在OpenCV中提供了很多比较便捷的操作函数,本文涉及函数如下: 1.cvtColor 颜色空间转换 2.convertTo 图片数据类型转换 3.spl ...
- python opencv 图片/视频 拼接
python opencv 图片/视频 拼接 # coding: utf-8 # 像写诗一样写代码 import numpy as np import cv2img_A_path = "C: ...
- python pyqt5图片(QPixmap)和opencv图片数据结构相互转换
python pyqt5图片(QPixmap)和opencv图片数据结构相互转换 在python中使用pyqt5和opencv混合编程时,有时需要两种图片数据结构的相互转换.网上比较多的是把openc ...
- 学习|OpenCV图片修复函数inpaint
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2020字,预计阅读6分钟 OpenCV图片修复 最近重新学习OpenCV的基础,偶然间发现了npaint的函数,于是就自己做了 ...
最新文章
- 洛谷1522牛的旅行
- 面试题:一条 sql 语句是如何经过 MySQL 的体系结构的?
- tensorflow学习之常用函数总结:tensorflow官方例子中的诸如tf.reduce_mean()这类函数
- 数据库同样数据,本地和服务器查询效率相差百倍
- button的OnClick与OnClientClick事件
- “乐享生活,随心而行”,第四届APEC车联网研讨会即将在上海召开
- phpcms模板标签整理
- 关于Session、Cookie、Token你知道多少?
- 小旋风虚拟服务器怎么用,超级小旋风asp服务器软件使用图文教程
- ESP32-WROOM-32E,WIFI基本功能实现,采坑经验
- word无法显示下划线
- 右击文件转圈卡住、刷新、白屏、闪退、桌面崩溃的通用解决方法
- 前端开发一枚,入职前自学的感觉不难,为什么工作起来很吃力?
- netty-socketio+spring boot 长链接 实时通信 消息推送
- Linux 自定义service,并重定向输出到日志文件
- 迅雷软件一直出现崩溃问题的解决方法
- 软考高级 真题 2013年下半年 信息系统项目管理师 案例分析
- Netty关于黏包和半包的处理
- 电力电子器件篇之电容
- iOS菜鸟学习——UITextField return键隐藏键盘