轻松掌握opencv的8种图像变换

文章目录

  • opencv的8种图像变换
    • 1. 图像放大、缩小
    • 2. 图像平移
    • 3. 图像旋转
    • 4. 图像仿射变换
    • 5. 图像裁剪
    • 6. 图像的位运算(AND, OR, XOR)
    • 7. 图像的分离和融合
    • 8. 图像的颜色空间

opencv的8种图像变换

1. 图像放大、缩小

我们先看下原图
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread(‘image/logo.png’)
plt.imshow(img)
在这里插入图片描述

看下图像大小
#height,width, channel
height,width,channel = img.shape
在这里插入图片描述

图像放大缩小
使用cv2.resize()方法
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
参数解释
在这里插入图片描述

dsize形参是个数组,数组的宽度在前,高度在后(output_width,output_height)
图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:
INTER_NEAREST - 最近邻插值
INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
INTER_CUBIC - 4x4像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

#图像放大
resized_img = cv2.resize(img,(width2,height2),interpolation=cv2.INTER_LINEAR)
plt.imshow(resized_img)
在这里插入图片描述

看下此时图像大小,确守放大了1倍
在这里插入图片描述

图像缩小
#图像缩小
smaller_img = cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR)
plt.imshow(smaller_img)
可以看到图像缩小了一倍
在这里插入图片描述

2. 图像平移

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
src:输入图像
M:运算矩阵,2行3列的,数据类型要求是float32位及以上
dsize:运算后矩阵的大小,也就是输出图片的尺寸。是个元祖,宽度在前,高度在后
dst:输出图像
flags:插值方法的组合,与resize函数中的插值一样,可以查看cv2.resize
borderMode:像素外推方法,边界像素的模型( int 类型),详情参考官网
borderValue:在恒定边框的情况下使用的borderValue值; 边界填充的颜色, 默认为 (0, 0, 0) (黑色)

图像平移
#图像平移
#先获取原来的高和宽
height,width = img.shape[:2]
M = np.float32([[1,0,20],[0,1,10]]) #图像平移。向右平移20个像素,向下平移10个像素
move_img = cv2.warpAffine(img,M,(width,height))
在这里插入图片描述

我们详细分析下M这个矩阵
下面的M相当于就是一个运算矩阵。2行3列
在这里插入图片描述

根据定义,我们的坐标就可以根据A,B来进行运算
在这里插入图片描述

可以很轻易的得出以下方程
在这里插入图片描述

通过方程我们就可以很轻易的看出,c1和c2就相当于是让图像平移,而a和b这2个参数就是对图像进行旋转,缩放等操作。

对图片进行三维旋转
#图像旋转
#先获取原来的高和宽
height,width = img.shape[:2]
M = np.float32([[1,0.2,0],[0.2,1,0]]) #图像平移。向右平移20个像素,向下平移10个像素
scoll_img = cv2.warpAffine(img,M,(width,height))

plt.imshow(scoll_img)
在这里插入图片描述

3. 图像旋转

  1. rot_mat = cv2.getRotationMatrix2D(center, -5, 1)

参数说明:center表示中间点的位置,-5表示顺时针旋转5度,1表示进行等比列的缩放

  1. cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))

参数说明: img表示输入的图片,rot_mat表示仿射变化矩阵,(image.shape[1], image.shape[0])表示变换后的图片大小
在这里插入图片描述

#先获取原来的高和宽
height,width = img.shape[:2]

#设置旋转的中心
center = (width //2.0, height//2.0) #旋转中心

M2 = cv2.getRotationMatrix2D(center,180,1) #1表示旋转过程中有没缩放,180表示逆时针旋转,负数表示顺时针旋转

rotation_img = cv2.warpAffine(img,M2,(width,height))

plt.imshow(rotation_img)

等比例旋转180
在这里插入图片描述

4. 图像仿射变换

对于更复杂仿射变换,OpenCV提供了函数cv2.getAffineTransform()来生成仿射函数cv2.warpAffine()所使用的转换矩阵M。
该函数的语法格式为:
retval=cv2.getAffineTransform(src, dst)
src代表输入图像的三个点坐标。
dst代表输出图像的三个点坐标。
参数值src和dst是包含三个一维数组(x, y)点的二维数组。
指代原始图像和目标图像内平行四边形的三个顶点(左上角、右上角、左下角)

上述参数通过函数cv2.getAffineTransform()定义了两个平行四边形。
src和dst中的三个点分别对应平行四边形的左上角、右上角、左下角三个点。
函数cv2.warpAffine()以函数cv2.getAffineTransform()获取的转换矩阵M为参数,将src中的点仿射到dst中。
函数cv2.getAffineTransform()对所指定的点完成映射后,将所有其他点的映射关系按照指定点的关系计算确定。

#图像仿射变换
p1 = np.float32([[120,35],[215,45],[135,120]])
p2 = np.float32([[135,45],[300,110],[130,230]])
M3 = cv2.getAffineTransform(p1,p2) #计算一个变换矩阵
trans_img = cv2.warpAffine(img,M3,(width,height))
plt.imshow(trans_img)
在这里插入图片描述

5. 图像裁剪

#图像剪裁,裁剪像素范围

crop_img = img[20:100,20:40]
plt.imshow(crop_img)
在这里插入图片描述

6. 图像的位运算(AND, OR, XOR)

位运算都是针对多张图形来计算的
我们先创建两个图形
绘制长方形
#长方形
rectangle = np.zeros((300,300),dtype=‘uint8’)
rect_img = cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )

参数表示依次为: (图片,长方形框左上角坐标, 长方形框右下角坐标, 字体颜色,字体粗细)

plt.imshow(rect_img)
在这里插入图片描述

画布画圆
circle(img, center, radius, color, thickness=None, lineType=None, shift=None):
含义:图片,中心店,半径,颜色,圆轮廓粗细,线类型。

#画圆
rectangle = np.zeros((300,300),dtype=‘uint8’)
circle_img = cv2.circle(rectangle,(150,150),150,255,-1)
plt.imshow(circle_img)
在这里插入图片描述

#与运算
and_img = cv2.bitwise_and(rect_img,circle_img)
plt.imshow(and_img)

可见两张图重合的部分被画出
在这里插入图片描述

#或运算 OR
or_img = cv2.bitwise_or(rect_img,circle_img)
plt.imshow(or_img)
在这里插入图片描述

#异或运算 XOR
两张图片不重叠的部分
xor_img = cv2.bitwise_xor(rect_img,circle_img)
plt.imshow(xor_img)
在这里插入图片描述

7. 图像的分离和融合

#图像的分离
B,G,R = cv2.split(img)

plt.imshow(B)
在这里插入图片描述

plt.imshow(G)
在这里插入图片描述

plt.imshow®
在这里插入图片描述

在使用opencv和matplotlib的过程中会遇到图像反色或者生成的是伪彩色图像的问题,
原因是两个读取RGB通道的顺序是不一样的,opencv的顺序是B-G-R,而matplotlib的顺序是R-G-B,所以这个区分就会产生一些矛盾。

图像合并
matplotlib这样显示才是正常颜色
plt.imshow(cv2.merge([R,G,B]))
在这里插入图片描述

对比下直接用matplotlib和cv2的显示
在这里插入图片描述

8. 图像的颜色空间

#颜色空间
#灰度
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(gray)
在这里插入图片描述

#HSV(色度,饱和度,纯度)
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
plt.imshow(hsv)
在这里插入图片描述

#lab
lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
plt.imshow(lab)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 模型分享:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 A-Zovya RPG Artist Tools 模型是一个针对 RPG 训练的一个模型,可以生成一些 R…

用友U8库存展望数据显示错误

1、库存展望显示有订单在途。 2、双击查看明细,显示某个采购订单显示有预计入库量。 3、查询该采购订单,发现已入库完成未退货,确定为数据异常。 修改采购订单表体的iReceivedQTY(累计到货数量)字段后,恢复正常。 UPDATE dbo.PO_…

这6款实用的AI写作软件你值得拥有

在当今信息爆炸的时代,人们对于高效、便捷的写作工具需求越来越迫切。AI写作软件应运而生,为广大写作者提供了更加智能、高效的写作方式。在国内,有许多优秀的AI写作软件,下面就为大家介绍6款实用的AI写作软件,让你的写…

ELK 简介安装

1、概念介绍 日志介绍 日志就是程序产生的,遵循一定格式(通常包含时间戳)的文本数据。 通常日志由服务器生成,输出到不同的文件中,一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。 日志…

Unity Meta XR SDK 快捷配置开发工具【Building Block/Quick Action/OVRCameraRigInteraction】

文章目录 📕教程说明📕Building Block📕Quick Action📕OVRCameraRigInteraction 此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 社区,博主目前在内…

如何设置路由器的端口映射?

路由器端口映射是一种常用的网络配置方式,可以将外部网络请求转发到内部网络上的指定设备。通过设置端口映射,我们可以实现远程访问局域网内的设备,使其在任何网络环境下都可以被访问。本文将介绍如何设置路由器的端口映射,以便实…

华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)--Python3--开源

题目: 考察内容: for 时间窗口list(append, sum, sort) join 代码: """ 题目分析:最长时间段 且平均值小于等于minLost同时存在多个时间段,则输出多个,从大到小排序未找到返回 NULL 输入…

大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术,很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务,关键词搜索是构建搜索系统最常用的方法,最常用的搜索算法是Okapi BM25&#x…

TCP/IP协议详解

文章目录 TCP/IP协议概述基于TCP/IP协议的应用工具协议协议的必要性 TCP/IP协议TCP/IP协议族协议的分层 传输方式的分类报文、帧、数据包等的区别TCP 和 UDP的区别 TCP/IP协议概述 TCP/IP(Transmission Control Protocol/Internet Protocol)是一组通信协…

使用 package.json 配置代理解决 React 项目中的跨域请求问题

使用 package.json 配置代理解决 React 项目中的跨域请求问题 当我们在开发前端应用时,经常会遇到跨域请求的问题。为了解决这个问题,我们可以通过配置代理来实现在开发环境中向后端服务器发送请求。 在 React 项目中,我们可以使用 package…

Cubemax创建FreeRTOS工程

目录 1.选择芯片型号,进入Pinout & Configuration 2.配置RCC的HSE为晶体/陶瓷振荡器 4.配置LED-GPIO引脚 5.配置调试串口UART1 6.配置FreeRTOS 7.配置时钟 8.工程管理配置 9.生成代码 1.选择芯片型号,进入Pinout & Configuration 2.配置…

【Python机器学习】详解Python机器学习进行时间序列预测

🔗 运行环境:Python 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 🔐#### 防伪水印——左手の明天 ####🔐 💗 大家…

横空出世,Bright Data 低代码数据平台,即将颠覆你的认知!

大家好,我是锋哥,最近接了个监控平台的私活项目。由于监控公开的站点太多,在我无从下手迷茫之际,竟然无意中发现了这个宝藏级低代码数据平台 - 亮数据。功能强大,性能炸裂! 传统开发 以前我们开发这种监控…

庖丁解牛-二叉树的遍历

庖丁解牛-二叉树的遍历 〇、前言 01 文章内容 一般提到二叉树的遍历,我们是在说 前序遍历、中序遍历、后序遍历和层序遍历 或者说三序遍历层序遍历,毕竟三序和层序的遍历逻辑相差比较大下面讨论三序遍历的递归方法、非递归方法和非递归迭代的统一方法然…

Python编程语言的特点和优点

Python编程语言的特点和优缺点 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅和支持~ 💡 …

设计模式复习

设计模式 1、什么是设计模式 一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动.尽管Alexander所指的是城市和建筑模式,但他的思想也同样适用于于面向对象设计模式&…

【DDD】学习笔记-发布者—订阅者模式

在领域设计模型中引入了领域事件,并不意味着就采用了领域事件建模范式,此时的领域事件仅仅作为一种架构或设计模式而已,属于领域设计模型的设计要素。在领域设计建模阶段,如何选择和设计领域事件,存在不同的模式&#…

Jenkins 中部署Nodejs插件并使用,并构建前端项目(3)

遇到多个版本nodeJS需要构建的时候 1、第一种就是一个配置安装,然后进行选中配置 2、第二种就是插件:nvm-wrapper,我们还是选用NodeJS插件: (1)可以加载任意npmrc文件; (2&#x…

【Unity自制手册】Unity—Camera相机跟随的方法大全

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

Python自动化UI测试之Selenium基础实操

1. Selenium简介 Selenium 是一个用于 Web 应用程序测试的工具。最初是为网站自动化测试而开发的,可以直接运行在浏览器上,支持的浏览器包括 IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Googl…