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

news2025/1/11 9:53:16

文章目录

  • 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.coloradmin.cn/o/1464763.html

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

相关文章

文献速递:GAN医学影像合成--基于生成对抗网络的肺部图像分类的多域医学图像翻译生成

文献速递:GAN医学影像合成–基于生成对抗网络的肺部图像分类的多域医学图像翻译生成 01 文献速递介绍 在2019年底,一种称为2019冠状病毒病(COVID-19)的新型冠状病毒肺炎出现,迅速成为全球性大流行。感染COVID-19可以…

本机防攻击简介

定义 在网络中,存在着大量针对CPU(Central Processing Unit)的恶意攻击报文以及需要正常上送CPU的各类报文。针对CPU的恶意攻击报文会导致CPU长时间繁忙的处理攻击报文,从而引发其他业务的中断甚至系统的中断;大量正常…

IOS和Android系统架构

IOS的系统架构 iOS的为Objective-C和Swift,Objective-C的优势是效率高但比较“唯一”。 响应顺序:Touch--Media--Service--Core架构 分为四个层次:核心操作系统层(core OS layer)、核心服务层(Core Serv…

STM32Cubemx TB6612直流电机驱动

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

一种基于动态水位值的Flink调度优化算法(flink1.5以前),等同于实现flink的Credit-based反压原理

优化flink反压 说明1 flink反压介绍1.1 介绍1.2 大数据系统反压现状1.4 flink task与task之间的反压1.5 netty水位机制作用分析 2 反压优化算法3 重点! 但是 可但是 flink1.5以后的反压过程。4 flink反压问题的查找瓶颈办法 说明 首先说明,偶然看了个论…

短剧小程序系统,重塑视频观看体验的科技革命

随着科技的飞速发展,人们对于数字化内容的消费需求也在不断增长。在这个大背景下,短剧小程序作为一种新型的视频观看方式,正逐渐受到大众的青睐。本文将探讨短剧小程序的发展背景、特点以及市场前景,分析其在重塑视频观看体验方面…

哪个牌子的护眼台灯比较好用?纯干货护眼台灯品牌推荐

有些家长陪孩子写作业的时候发现他们总是在揉眼睛,学习时间久了还会用力眨眼睛。其实无论是白天还是晚上,孩子在家学习,看书,搭积木等,如果灯光不给力,一定要用台灯来给孩子补光,避免因为光线环…

Linux系列讲解 —— 【Vim编辑器】在Ubuntu18.04中安装新版Vim

平时用的电脑系统是Ubuntu18.04,使用apt安装VIM的默认版本是8.0。如果想要安装新版的Vim编辑器,只能下载Vim源码后进行编译安装。 目录 1. 下载Vim源码2. 编译3. 安装4. 遇到的问题4.1 打开vim后,文本开头有乱码现象。4.2 在Vim编辑器中&…

测试环境搭建整套大数据系统(三:搭建集群zookeeper,hdfs,mapreduce,yarn,hive)

一:搭建zk https://blog.csdn.net/weixin_43446246/article/details/123327143 二:搭建hadoop,yarn,mapreduce。 1. 安装hadoop。 sudo tar -zxvf hadoop-3.2.4.tar.gz -C /opt2. 修改java配置路径。 cd /opt/hadoop-3.2.4/etc…

【Spring】SpringBoot 热部署

目 录 一.添加热部署框架支持二.Settings 开启项目自动编译三.设置运行项目中的热部署( idea 2021.2版本)四.使用 debug 方式运行项目代码示例&#xff1a; 一.添加热部署框架支持 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

适合中国人体质的低成本创业项目,抖音小店抓住小钱到大钱的之路

大家好&#xff0c;我是电商花花。 人啊&#xff0c;这一辈子想要赚钱&#xff0c;想要脱贫致富&#xff0c;小钱靠勤&#xff0c;中财靠运&#xff0c;大富靠命。 我还依稀记得母亲说的一句话&#xff0c;小钱不勤不聚&#xff0c;还谈何赚大钱&#xff0c;所有的大钱也都是…

Unity3d Mesh篇(二)— 创建Unity Logo平面

文章目录 前言一、Mesh组成二、使用步骤GetVertices方法GetNormal方法GetTriangles方法OnDrawGizmos方法 三、效果四、总结 前言 本篇将使用C#脚本实现在Unity中创建平面&#xff0c;并通过调整顶点、UV坐标和三角形来生成Unity Logo 的效果。 一、Mesh组成 顶点&#xff08;…

了解红帽认证,看这篇就够了!

红帽公司成立于1993年&#xff0c;是全球首家收入超10亿美元的开源公司&#xff0c;总部位于美国&#xff0c;分支机构遍布全球。 红帽公司作为全球领先的开源和Linux系统提供商&#xff0c;其产品已被业界广泛认可并使用&#xff0c;尤其是RHEL系统在业内拥有超高的Linux系统…

css3d制作正方体

使用css3d技术 &#xff0c;制作一个可以动态动画的正方体模型 效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html> <head><style>/* 设置高度宽度100%并且左右居中、上下居中 */html,body {width: 100%;height: 100%;display: flex…

C#串口 Modbus通讯工具类

一、安装Modbus包 二、创建modbushelper类 1、打开串口 public bool IfCOMOpend; //用于实例内的COM口的状态 public SerialPort OpenedCOM;//用于手动输入的COM转成SERIAL PORT /// <summary> /// 打开串口 /// </summary> /// <param name="COMname&quo…

2-22算法习题总结

贪心问题 凌乱的yyy / 线段覆盖 题目背景 快 noip 了&#xff0c;yyy 很紧张&#xff01; 题目描述 现在各大 oj 上有 n n n 个比赛&#xff0c;每个比赛的开始、结束的时间点是知道的。 yyy 认为&#xff0c;参加越多的比赛&#xff0c;noip 就能考的越好&#xff08;假…

Day04-课后练习以及参考答案(流程控制语句_循环结构)

文章目录 巩固题1、5个一行输出1-100之间的偶数2、趣味折纸3、实现输出如下任一个数字三角形4、计算这一天是这一年的第几天 拔高题1、计算这一天是这一年的第几天2、计算这一天是在打鱼还是晒网3、打印『X』对称图形4、打印空心菱形 巩固题 1、5个一行输出1-100之间的偶数 &…

【更新】ARCGIS之成片区开发方案报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的成片区开发方案报备格式是按湖北省的标准定制的&#xff0c;目前&#xff0c;自然资源部又有了新的格式要求&#xff0c;现在新增国标版的成片区开发方案报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&…

YOLOv9 | 利用YOLOv9训练自己的数据集 -> 推理、验证(源码解读 + 手撕结构图)

一、本文介绍 本文给大家带来的是全新的SOTA模型YOLOv9的基础使用教程&#xff0c;需要注意的是YOLOv9发布时间为2024年2月21日&#xff0c;截至最近的日期也没有过去几天&#xff0c;从其实验结果上来看&#xff0c;其效果无论是精度和参数量都要大于过去的一些实时检测模型&…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…