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…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
