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…...

全面解析:区块链技术及其应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 全面解析:区块链技术及其应用 文章目录 全面解析:区块链技术及其应用什么是区块链区块链的工作原理1. 分…...

python基础学习笔记
本文类比c语言讲解python 一.变量和类型 前缀小知识: 注意:1.python写每一行代码时,结尾不需要 ; 这点是和c语言有很大区别的 2.代码的缩进(就是每行代码前面的空格)是非常重要的后文会提到 1.定义变量 注意: 和C/C …...

【dvwa靶场:XSS系列】XSS (DOM) 低-中-高级别,通关啦
一、低级low 拼接的url样式: http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default 拼接的新内容 <script>alert("假客套")</script> 二、中级middle 拼接的url样式: http://127.0.0.1/dvwa/vuln…...

ONLYOFFICE 8.2深度体验:高效协作与卓越性能的完美融合
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ONLYOFFICE 8.2 🔍引言📒1. ONLYOFFICE 产品简介📚2. 功能与特点🍁协作编辑 PDF🍂…...

Mac如何将多个pdf文件归并到一个
电脑:MacBook Pro M1 操作方式: very easy 选中想要归并的所有pdf文件,然后 右键 -> quick actions -> Create PDF 然后就可以看到将所选pdf文件归并为一个pdf的文件了...

LINUX下的Mysql:Mysql基础
目录 1.为什要有数据库 2.什么是数据库 3.LINUX下创建数据库的操作 4.LINUX创建表的操作 5.SQL语句的分类 6.Mysql的架构 1.为什要有数据库 直接用文件直接存储数据难道不行吗?非得搞个数据库呢? 首先用文件存储数据是没错,但是文件不方…...

自然语言处理方向学习建议
自然语言处理方向学习建议 自然语言处理(NLP)作为人工智能的一个重要分支,近年来在学术界和工业界都取得了显著的发展。作为即将或正在攻读博士学位的你,投身于NLP领域无疑是一个充满挑战与机遇的选择。以下是一些针对NLP方向学习…...

介绍一下如何生成随机数(c基础)
适合对象 c语言初学者 总结语言用色,个人强调用红色,注意为易错点,若有问题请告诉我谢谢。(建议通过目录观看)。一定要自己动手打代码。 rand函数 是生成随机数的函数,但实则是伪随机数。(即是同一个值) 格式 #include<st…...

24-11-1-读书笔记(三十一)-《契诃夫文集》(五)下([俄] 契诃夫 [译] 汝龙)生活乏味但不乏魅力。
文章目录 《契诃夫文集》(五)下([俄] 契诃夫 [译] 汝龙)生活乏味但不乏魅力。目录阅读笔记总结 《契诃夫文集》(五)下([俄] 契诃夫 [译] 汝龙)生活乏味但不乏魅力。 休息,…...

从“点”到“面”,热成像防爆手机如何为安全织就“透视网”?
市场上测温产品让人眼花缭乱,通过调研分析,小编发现测温枪占很高比重。但是,测温枪局限于显示单一数值信息,无法直观地展示物体的整体温度分布情况,而且几乎没有功能拓展能力。以AORO A23为代表的热成像防爆手机改变了…...