Day23 opencv图像预处理
图像预处理
在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,常见的操作包括图像空间转换、图像大小调整、图像仿射变换、图像翻转、图像裁剪、图像二值化处理、图像去噪、边缘检测、图像平滑处理和图像形态学等。
图像翻转
cv2.flip 是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。该函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。示例代码展示了如何使用 cv2.flip 进行图像翻转。
import cv2
img = cv2.imread(r'C:\Users\My Documents\car.png')
#翻转 0:垂直翻转 1: 水平翻转 -1 是水平垂直翻转
f_img = cv2.flip(img,-1)
cv2.imshow("old",img)
cv2.imshow("new",f_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像仿射变换
仿射变换是一种线性变换,保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。通过 cv2.getRotationMatrix2D 和 cv2.warpAffine 函数,可以实现图像的旋转、平移和缩放等操作。
图像旋转
旋转操作可以将图像绕着某个点旋转一定的角度。通过 cv2.getRotationMatrix2D 计算旋转矩阵,并使用 cv2.warpAffine 进行旋转操作。
import cv2
img = cv2.imread("images/car.png")
#获取图片的像素
(h,w) = img.shape[:2]
#旋转的坐标
center =(100,120)
#旋转的角度
du = 30
#获取图像矩阵
m = cv2.getRotationMatrix2D(center,du,1)
#图像旋转
w_img=cv2.warpAffine(img,m,(w,h))
cv2.imshow("image",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像平移
平移操作可以将图像中的每个点沿着某个方向移动一定的距离。通过定义平移矩阵并使用 cv2.warpAffine 进行平移操作。
import cv2
import numpy as np
img = cv2.imread("images/car.png")
(h,w) = img.shape[:2]
#定义平移水平和垂直移动的距离
ty = 0
tx = 100
#创建一个平移矩阵
t_img = np.float32([[1,0,tx],[0,1,ty]])
#t_img = cv2.getRotationMatrix2D((tx,ty),-1,1)
w_img = cv2.warpAffine(img,t_img,(w,h))
cv2.imshow("m",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像缩放
缩放操作可以改变图像的大小。通过定义缩放因子并使用 cv2.warpAffine 进行缩放操作。
import cv2
import numpy as np
img = cv2.imread("images/car.png")
(h,w) = img.shape[:2]
print(h,w)
#定义缩放的参数, 缩放的参数大于1的是放大,小于1 的是缩小
ww = 0.5
hh = 0.5
m = np.float32([[ww,0,0],[0,hh,0]])
#仿射变化
t_img = cv2.warpAffine(img,m,(int(w*ww),int(h*hh)))
(h,w) = t_img.shape[:2]
print(h,w)
cv2.imshow("m",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像剪切
剪切操作可以改变图像的形状,使其在某个方向上倾斜。通过定义剪切因子并使用 cv2.warpAffine 进行剪切操作。
import cv2
import numpy as np
img = cv2.imread("images/car.png")
(h,w) = img.shape[:2]
#定义图像剪切的参数
sx = 0.2
sy =0.1
#定义矩形
m = np.float32([[1,sx,0],[sy,1,0]])
#图像剪切
i_img = cv2.warpAffine(img,m,(w,h))
cv2.imshow("o",img)
cv2.imshow("a",i_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像色彩空间转换
OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。色彩空间转换在图像处理中非常重要,可以方便图像处理、提高图像处理效果和节省计算资源。
RGB 转 Gray(灰度)
将彩色图像转换为灰度图像,可以减少数据量并简化算法。通过 cv2.cvtColor 函数将图像从BGR转换为灰度图像。
import cv2
img = cv2.imread("images/car.png")
print(img)
#图像色彩空间转换
#opencv 默认的图像格式BGR
#COLOR_BGR2GRAY 把BGR图像转换成灰度图像
gay_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("--------------------------------------")
print(gay_img)
cv2.imshow("old",img)
cv2.imshow("new",gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
RGB 转 HSV
HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。通过 cv2.cvtColor 函数将图像从BGR转换为HSV颜色空间。
图像二值化处理
cv2.threshold 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。通过 cv2.threshold 函数可以将灰度图像转换为二值图像。
import cv2
img = cv2.imread("images/car.png")
#把图像转换成灰度图像
g_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化处理
#rs 实际应用阈值,t_img 转换后的图像
rs,t_img = cv2.threshold(g_img,150,255,cv2.THRESH_BINARY)
cv2.imshow("aa",img)
cv2.imshow("a",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像掩模
cv2.inRange 函数用于创建掩模,以便从图像中提取特定颜色的区域。通过定义颜色范围并使用 cv2.inRange 函数创建掩模。
import cv2
import numpy as np
img = cv2.imread(r'My Documents\car.png')
#把图像转换为HSV空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#获取蓝色所在范围
lower = np.array([101,100,50])
height = np.array([140,255,255])
#创建掩膜
mask = cv2.inRange(hsv_img, lower, height)
cv2.imshow('imp', img)
cv2.imshow('a', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像位与操作
cv2.bitwise_and 是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。
图像检测轮廓
cv2.findContours 函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。通过 cv2.findContours 函数查找轮廓,并通过 cv2.drawContours 函数绘制轮廓。
import cv2
import numpy as np
img =cv2.imread(r'C:\Users\My Documents\car.png')
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array([100, 100, 100])
upper = np.array([140, 255, 255])
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
#二值化处理
ret,i_img = cv2.threshold(mask,120,255,cv2.THRESH_BINARY)
#获取图片的轮廓
myList,c = cv2.findContours(i_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
num = len(myList)
print(f"长度={num}")
for c in myList:
x,y,w,h = cv2.boundingRect(c)
print(x,y,w,h )
#画个矩形
if w > 100 and h >45:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
#车牌切割
qie_img = img[y:y+h,x:x+w]
cv2.imshow("a",qie_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
最小外接矩形
cv2.boundingRect 是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。
相关文章:
Day23 opencv图像预处理
图像预处理 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,常见的操作包括图像空间转换、图像大小调…...
优化模型训练过程中的显存使用率、GPU使用率
参考:https://blog.51cto.com/u_16099172/7398948 问题:用小数据集训练显存使用率、GPU使用率正常,但是用大数据集训练GPU使用率一直是0. 小数据: 大数据: 1、我理解GPU内存占用率显存使用率,由模型的大小…...
RocketMQ学习笔记
RocketMQ笔记 文章目录 一、引言⼆、RocketMQ介绍RocketMQ的由来 三、RocketMQ的基本概念1 技术架构2 部署架构 四、快速开始1.下载RocketMQ2.安装RocketMQ3.启动NameServer4.启动Broker5.使⽤发送和接收消息验证MQ6.关闭服务器 五、搭建RocketMQ集群1.RocketMQ集群模式2.搭建主…...
Linux第三讲:环境基础开发工具使用
Linux第三讲:环境基础开发工具使用 1.Linux软件包管理器yum1.1什么是软件包管理器1.2操作系统生态问题1.3什么是yum源 2.vim详解2.1什么是vim2.2vim的多模式讲解2.2.1命令模式的诸多指令2.2.1.1gg和nshiftg2.2.1.2shift$和shift^2.2.1.3上、下、左、右2.2.1.4w和b2.…...
日本TikTok直播的未来:专线网络助力创作者突破极限
近年来,随着短视频平台的崛起,尤其是TikTok(国际版抖音)成为全球范围内广受欢迎的社交娱乐平台,直播功能的加入无疑为内容创作者提供了更广阔的展示舞台。在日本,TikTok直播不仅使得年轻人能够实时与粉丝互…...
如何在家庭网络中设置静态IP地址:一份实用指南
在家庭网络环境中,IP地址扮演着至关重要的角色。大多数家庭用户依赖路由器的DHCP(动态主机配置协议)来自动分配IP地址,但在某些情况下,手动设置静态IP地址能为家庭网络带来更多的便利性与稳定性,尤其是在涉…...
qt QFile详解
1、概述 QFile类是Qt框架中用于读取和写入文本和二进制文件资源的I/O工具类。它继承自QFileDevice类,后者又继承自QIODevice类。QFile类提供了一个接口,允许开发者以二进制模式或文本模式对文件进行读写操作。默认情况下,QFile假定文件内容为…...
ESP8266 自定义固件烧录-Tcpsocket固件
一、固件介绍 固件为自定义开发的一个适配物联网项目的开源固件,支持网页配网、支持网页tcpsocket服务器配置、支持串口波特率设置。 方便、快捷、稳定! 二、烧录说明 固件及工具打包下载地址: https://download.csdn.net/download/flyai…...
内网项目,maven本地仓库离线打包,解决Cannot access central in offline mode?
背景: 内网项目打包,解决Cannot access central in offline mode? 1、修改maven配置文件: localRepository改为本地仓库位置 <localRepository>D:\WorkSpace\WorkSoft\maven-repository\iwhalecloud-repository\business</loca…...
stack和queue --->容器适配器
不支持迭代器,迭代器无法满足他们的性质 边出边判断 实现 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<stack> #include<queue> using namespace std; int main() {stack<int> st;st.push(1);st.push(2);st.push(3);…...
ffmpeg视频解码
一、视频解码流程 使用ffmpeg解码视频帧主要可分为两大步骤:初始化解码器和解码视频帧,以下代码以mjpeg为例 1. 初始化解码器 初始化解码器主要有以下步骤: (1)查找解码器 // 查找MJPEG解码器pCodec avcodec_fin…...
前端入门一之CSS知识详解
前言 CSS是前端三件套之一,在MarkDown中也完美兼容这些语法;这篇文章是本人大一学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。 文章目录 Emmet语法:CSS基本语法:css语法结构只有3种:…...
【JS学习】10. web API-BOM
文章目录 Web APIs - 第5天笔记js组成window对象定时器-延迟函数location对象navigator对象histroy对象本地存储(今日重点)localStorage(重点)sessionStorage(了解)localStorage 存储复杂数据类型 综合案例…...
C#实现递归获取所有父级的列表
条件: 父级的id是子级的父id形成递归条件 实现功能: 获取自己到最顶级父级的列表(假如最顶级父级的父ID0) 代码: 解释:CF_CODE是自己的ID,CF_PARENT_ID是父id /// <summary>/// 递归获…...
【深度学习】梯度累加和直接用大的batchsize有什么区别
梯度累加与使用较大的batchsize有类似的效果,但是也有区别 1.内存和计算资源要求 梯度累加: 通过在多个小的mini-batch上分别计算梯度并累积,梯度累积不需要一次加载所有数据,因此显著减少了内存需求。这对于显存有限的设别尤为重…...
【Linux】网络相关的命令
目录 ① ip addr show ② ip route show ③ iptables -nvL ④ ping -I enx00e04c6666c0 192.168.1.100 ⑤ ip route get 192.168.1.100 ⑥ sudo ip addr add dev enx00e04c6666c0 192.168.1.101/24 ⑦ ifconfig ⑧ netstat ⑨ traceroute ⑩ nslookup ① ip addr sho…...
leetcode哈希表(五)-四数相加II
题目 454.四数相加II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入&…...
Java学习路线:Maven(一)认识Maven
目录 认识Maven 新建Maven文件 导入依赖 认识Maven Maven是一个Java的项目管理工具,通过Maven,我们可以实现: 项目自动构建,包括代码的编译、测试、打包、安装等依赖管理,快速完成依赖的导入 在学习Maven之前&…...
【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、1×1 卷积层、汇聚层、多通道汇聚层
【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、11 卷积层、汇聚层、多通道汇聚层 多输入多输出通道多通道输入的卷积示例:多通道的二维互相关运算 多输出通道实现多通道输出的互相关运算 11 卷积层11 卷积的作用 使用全连接层实现 11 卷积小结 …...
java mapper 的 xml讲解
<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.bnc.s12.mapper.GoodaCateDT…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
