文章目录

  • 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:图片的几何变换相关推荐

  1. opencv图片线性混合可调

    opencv图片线性混合叠加.addWeighted()函数 直接上效果图 通过滚动条选择不同的透明值,使得两张图片进行不同程度的线性混合. 主要的代码是这句:addWeighted()函数 //根据 ...

  2. 2020-12-03 Python OpenCV: 图片的裁剪

    Python OpenCV: 图片的裁剪 图片裁剪使用img[y0:y1, x0:x1],其中参数分别代表y轴和x轴的起始坐标,具体使用方法如下: import cv2img = cv2.imread ...

  3. python+freetype+opencv 图片中文(汉字)显示 详细图文教程和项目完整源代码

    opencv图片写入中文(汉字)有两方法: 方法一: python+opencv+freetype https://blog.csdn.net/wyx100/article/details/75579 ...

  4. opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍

    本文来自于段力辉 译<OpenCV-Python 中文教程> 文章目录 一.图片 + 读入.显示.写出 1.cv2.imread() 2.cv2.imshow() 3.cv2.imwrit ...

  5. Pyhton opencv 图片裁剪

    Pyhton opencv 图片裁剪 opencv中可以通过 imread,imwrite进行图片读取和保存,imread读取图片后可以通过长度高度进行图片的裁剪 从上面图片可以得到,对角坐标是(x1 ...

  6. Python OpenCV 图片滑块验证码 滑块图片验证码 快速自动识别方案 代码简单 模板匹配识别 识别成功率达90%+

    前言 通过上一篇的文章大家已经对图片滑块验证码已经有了初步的了解,图片滑块验证码的核心关键在于图片识别接下来接入讲解.因为初版滑块图片识别虽然能识别验证码,通过一些策略调整也相对提高了一些图片识别率, ...

  7. 三:OpenCV图片颜色通道数据转换

    对图片进行操作时经常会涉及到不同通道数据提取,在OpenCV中提供了很多比较便捷的操作函数,本文涉及函数如下: 1.cvtColor 颜色空间转换 2.convertTo 图片数据类型转换 3.spl ...

  8. python opencv 图片/视频 拼接

    python opencv 图片/视频 拼接 # coding: utf-8 # 像写诗一样写代码 import numpy as np import cv2img_A_path = "C: ...

  9. python pyqt5图片(QPixmap)和opencv图片数据结构相互转换

    python pyqt5图片(QPixmap)和opencv图片数据结构相互转换 在python中使用pyqt5和opencv混合编程时,有时需要两种图片数据结构的相互转换.网上比较多的是把openc ...

  10. 学习|OpenCV图片修复函数inpaint

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2020字,预计阅读6分钟 OpenCV图片修复 最近重新学习OpenCV的基础,偶然间发现了npaint的函数,于是就自己做了 ...

最新文章

  1. 洛谷1522牛的旅行
  2. 面试题:一条 sql 语句是如何经过 MySQL 的体系结构的?
  3. tensorflow学习之常用函数总结:tensorflow官方例子中的诸如tf.reduce_mean()这类函数
  4. 数据库同样数据,本地和服务器查询效率相差百倍
  5. button的OnClick与OnClientClick事件
  6. “乐享生活,随心而行”,第四届APEC车联网研讨会即将在上海召开
  7. phpcms模板标签整理
  8. 关于Session、Cookie、Token你知道多少?
  9. 小旋风虚拟服务器怎么用,超级小旋风asp服务器软件使用图文教程
  10. ESP32-WROOM-32E,WIFI基本功能实现,采坑经验
  11. word无法显示下划线
  12. 右击文件转圈卡住、刷新、白屏、闪退、桌面崩溃的通用解决方法
  13. 前端开发一枚,入职前自学的感觉不难,为什么工作起来很吃力?
  14. netty-socketio+spring boot 长链接 实时通信 消息推送
  15. Linux 自定义service,并重定向输出到日志文件
  16. 迅雷软件一直出现崩溃问题的解决方法
  17. 软考高级 真题 2013年下半年 信息系统项目管理师 案例分析
  18. Netty关于黏包和半包的处理
  19. 电力电子器件篇之电容
  20. iOS菜鸟学习——UITextField return键隐藏键盘

热门文章

  1. RTSP协议播放网络视频
  2. VS工程,换电脑后出现的问题
  3. java证书已过期如何继续运行_过期证书上的Java trustmanager行为
  4. boot2源码-事务
  5. NET Micro FrameworkのTimerクラス攻略
  6. python3 + selenium 之窗口切换
  7. angular 定时函数
  8. 【Java从0到架构师】个人简历项目实战
  9. 软件设计师16-数据结构02(排序/查找)
  10. 走进我的交易室03_第一步成功的外部障碍