轻松掌握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.mzph.cn/news/697350.shtml

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

相关文章

基于java+springboot+vue实现的美食信息推荐系统(文末源码+Lw)23-170

1 摘 要 使用旧方法对美食信息推荐系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在美食信息推荐系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发…

Shell好用的工具: cut

目标 使用cut可以切割提取指定列\字符\字节的数据 介绍 cut 译为“剪切, 切割” , 是一个强大文本处理工具,它可以将文本按列进行划分的文本处理。cut命令逐行读入文本,然后按列划分字段并进行提取、输出等操作。 语法 cut [options] filename opti…

树中枝繁叶茂:探索 B+ 树、B 树、二叉树、红黑树和跳表的世界

欢迎来到我的博客,代码的世界里,每一行都是一个故事 树中枝繁叶茂:探索 B 树、B 树、二叉树、红黑树和跳表的世界 前言B树和B树B树(Binary Tree):B树(B Plus Tree):应用场…

STM32Cubemx TB6612直流电机驱动

一、TB6612FNG TB6612是一个支持双电机的驱动模块,支持PWM调速。PWMA、AIN1、AIN2 为一组控制引脚,PWMA 为 PWM 速度控制引脚,AIN1、AIN2 为方向控制引脚;PWMB、BIN1、BIN2 为一组控制引脚,PWMB 为 PWM 速度控制引脚&…

【力扣hot100】刷题笔记Day11

前言 科研不顺啊......又不想搞了,随便弄弄吧,多花点时间刷题,今天开启二叉树! 94. 二叉树的中序遍历 - 力扣(LeetCode) 递归 # 最简单递归 class Solution:def inorderTraversal(self, root: TreeNode) …

idea运行项目时右下角弹出“Lombok requires enabled annotation processing”

文章目录 错误描述原因分析解决方式参考 错误描述 Lombok requires enabled annotation processing:翻译过来就是Lombok 需要启用注释处理 原因分析 idea安装了Lombok插件,但有些设置未做。 解决方式 参考 idea配置和使用Lombok

【FPGA】高云FPGA之数字钟实验->HC595驱动数码管

高云FPGA之IP核的使用 1、设计定义2、设计输入2.1 数码管译码显示2.2 74HC595驱动2.3 主模块设计 3、分析和综合4、功能仿真6.1 hex8模块仿真6.2 HC595模块 5、布局布线6、时序仿真7、IO分配以及配置文件(bit流文件)的生成8、配置(烧录&#…

代码检测规范和git提交规范

摘要:之前开发的项目,代码检测和提交规范都是已经配置好的,最近自己新建的项目就记录下相关配置过程。 1. ESlint配置 2013年6月创建开源项目,提供一个插件化的JavaScript代码检测工具,创建项目是生成的eslintrc.js文…

【算法分析与设计】

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位…

如何使用Express框架构建一个简单的Web应用

在这个数字化时代,Web应用的需求越来越多样化和复杂化。在前端开发领域,Express框架作为一个快速、灵活的Node.js Web应用程序框架,拥有强大的功能和丰富的生态系统,深受开发者们的青睐。本篇博客将带您一步步探索如何使用Express…

Bert基础(四)--解码器(上)

1 理解解码器 假设我们想把英语句子I am good(原句)翻译成法语句子Je vais bien(目标句)。首先,将原句I am good送入编码器,使编码器学习原句,并计算特征值。在前文中,我们学习了编…

代码随想录算法训练营第四十天|343. 整数拆分、96. 不同的二叉搜索树。

343. 整数拆分 题目链接:整数拆分 题目描述: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 解题思路: 1、确定dp数组…

flink内存管理,设置思路,oom问题,一文全

flink内存管理 1 内存分配1.1 JVM 进程总内存(Total Process Memory)1.2 Flink 总内存(Total Flink Memory)1.3 JVM 堆外内存(JVM Off-Heap Memory)1.4 JVM 堆内存(JVM Heap Memory)…

运维的利器–监控–zabbix–第二步:建设–部署zabbix agent

文章目录 监控客户端部署及添加主机一、在 zabbix-server 安装客户端二、在本机和其他linux主机安装zabbix agent客户端1、安装2、配置3、启动并开机自启4、添加主机创建主机组创建主机等一会或重启zabbix-server查看配置是否成功 三、在其他windows上安装zabbix agent客户端下…

主流的开发语言和开发环境介绍

个人浅见,不喜勿喷,谢谢 软件开发是一个涉及多个方面的复杂过程,其中包括选择合适的编程语言和开发环境。编程语言是软件开发的核心,它定义了程序员用来编写指令的语法和规则。而开发环境则提供了编写、测试和调试代码的工具和平台…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…

WebService学习,wsdl文件详解

目录 第一章、起因1.1)学习原因1.2)提问的过程(逐步提出问题)1、?wsdl链接的含义,有什么作用?2、什么是wsdl文档?3、如何阅读wsdl文件?4、wsdl文件有什么作用&#xff1f…

基于springboot+vue的智慧社区系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

(十四)【Jmeter】线程(Threads(Users))之开放模型线程组(Open Model Thread Group)

简述 操作路径如下: 开放模型线程组(Open Model Thread Group) 是 JMeter 5.5 版本中引入的一个新特性,它允许用户创建具有可变负载的负载配置文件。相较于传统的线程组,开放模型线程组提供了更多的灵活性和动态调整的能力。 优点: 灵活性:允许测试人员根据测试需求动…

python 提取PDF文字

使用pdfplumber,不能提取扫描的pdf和插入的图片。 import pdfplumberfile_path rD:\UserData\admindesktop\官方文档\1903_Mesh-Models-Overview_FINAL.pdf with pdfplumber.open(file_path) as pdf:page pdf.pages[0]print(page.extract_text()) # 所以文字prin…