【Opencv+Yolo】_Day1图像基本处理
目录
一、计算机中的视觉:
二、Opencv基本操作:
图片基础处理:
视频基本处理:
图像截取(截取,合并,只保留一个元素)
图像填充
数值计算
图像融合
阈值判断
图像平滑
图像腐蚀和膨胀+开闭运算
梯度运算:
礼帽和黑帽
一、计算机中的视觉:
- 图像由像素点组成,像素点由数字矩阵组成(不同亮度:0-255)
- R、G、B三个通道---彩色图
- 图像维度:[H,W,3]
二、Opencv基本操作:
-
图片基础处理:
图片读取cv2.imread('xx.jpg')
图片窗口cv2.imshow()
获取图片属性img.shape()
以灰度形式读取图片img=cv2.imread('.jpg',cv2.IMREAD_GRAYSCALE)
import cv2 #opencv默认读取BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline#图片读取基本步骤
img=cv2.imread('cat.jpg')
img
cv2.imshow('image',img) #窗口名称+图像
cv2.waitKey(0) #0任意键终止,1000就是1000毫秒的意思,一般用0
cv2.destroyAllWindows()#获取图片属性
img.shape #H,W,C;C=3==RGB#以灰度图形式读取
img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
img
img.shape
cv_show('image',img)
#保存
cv2.imwrite('mycat.png',img)
或者可以把窗口写成一个函数
def cv_show(name,img):
#define a fuction
def cv_show(name,img):cv2.imgshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
-
视频基本处理:
首先读取视频路径,查看路径是否能够正确读取,显示窗口
#视频读取
#指定路径
vc=cv2.VideoCapture('test.mp4')
#检查是否打开正确
if vc.isOpened():open,frame = vc.read()#按顺序一帧一帧读取 open=True/false,第二个参数是当前帧的图像
else:open=Falsewhile open:ret,frame = vc.read()if frame is not None:breakif ret ==True:gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转换成灰度图cv2.imshow('result',gray)if cv2.waitKey(100) & 0xFF ==27:break
vc.release()
cv2.destroyAllWindows()
-
图像截取(截取,合并,只保留一个元素)
注意opencv顺序是BGR
#截取部分图像
img=cv2.imread('cat.img')
cat=img[0:200,0:200]#ROI截取
cv_show('cat',cat)
#颜色通道提取BGR
b,g,r=cv2.split(img)
b
b.shape
g
g.shape#bgr大小相同
#合并
img=cv2.merge((b,g,r))
img.shape
#只保留R
cur_img=img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show['R',cur_img]
#只保留G
cur_img=img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show['G',cur_img]
#只保留B
cur_img=img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show['B',cur_img]
-
图像填充
六种填充方法:
#边界填充
#上下左右分别填充大小
top_size,bottom_size,left_size,right_size = (50,50,50,50)
#复制法,复制最边缘像素
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
#反射法,对感兴趣的图像中的像素在两边进行复制abc cba
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
#反射法,以最边缘像素为轴,对称 gfedcb|abcdefg|hgfedcba
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
#外包装法,cedfgh|abcdefgh|abcdefg
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
#常量法,常数数值填充,0是黑框
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONStant,value=0)
import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')
plt.show()
-
数值计算
cv2.add(img1,img2)超过255,直接等于255
-
图像融合
必须两个图片size大小相同才可以融合
R = a*x1+b*x2+c 权重和偏置项
#想实现img_cat+img_dog
img_cat.shape
#resize变成猫图片的大小
img_dog=cv2.resize(img_dog,(500,414)
res=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
plt.show(res)
cv2.resize()还可以用作图片伸缩
#当不知道图片伸缩多少时,可以把x变成原来的1.5倍
res=cv2.resize(img,(0,0),fx=1.5,fy=1)
-
阈值判断
THRESH_BINARY:亮的全为白,黑的全为黑
THRESH_BINARY_INV:<127变成255,亮的变成黑的,黑的变成白的
THRESH_TRUNC:>127变成127,剩下的不改变,黑色部分不改变
THRESH_TOZERO:<127的变成0,黑色的部分更暗
-
图像平滑
均值滤波:
相当于构造一个filter=简单平均卷积操作
方框滤波:大于255的直接等于255
高斯滤波:构建高斯分布
中值滤波:使用中间值替代
#图像平滑
img2=cv2.imread('lenaNoise.png')
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#均值滤波加起来除个数求均值,一般选(3,5,7)
blur=cv2.blur(img,(3,3))
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
#方框滤波,基本和均值一样,可以选择归一化,大于255直接就是255
blur=cv2.boxFilter(img,-1,(3,3),normalize=True)
#高斯滤波,卷积核满足高斯分布
aussian = cv2.GaussianBlur(img,(5,5),1)
cv2.imshow('aussian',aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
#中值滤波,从小到大排序找中间值,中间值代替,不考虑噪声,推荐
median = cv2.medianBlur(img,5)
cv2.imshow('medien',medien)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、图像形态学操作
-
图像腐蚀和膨胀+开闭运算
当图片有一些杂纹,需要通过腐蚀来去掉
当腐蚀之后,可能对原图片有伤害,就要用膨胀恢复
#腐蚀操作,外面的颜色腐蚀里面,去掉杂纹
img=cv2.imread('dige.png')
cv2.imshow('img',img)
cv2.destoryAllWindows()
kernel = np.ones((3,3),np.unit8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
#膨胀操作,里面的颜色扩张
kernel = np.ones((3,3),np.unit8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate',dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
开运算:先腐蚀,再膨胀
闭运算:先膨胀,再腐蚀
#开运算:先腐蚀,再膨胀
img= cv2.imread('dige.png')
kernel = np.ones((5,5),np.unit8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭运算:先膨胀,再腐蚀
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
-
梯度运算:
得到轮廓边界信息
#梯度运算:
#梯度=膨胀-腐蚀
pie= cv2.imread('pie.png')
kernel = np.ones((7,7),np.unit8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)
res = np.hstack((dilate,erosion))
gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
-
礼帽和黑帽
礼帽=原始输入-开运算(原始的杂纹=原始-无杂纹)TOPHAT
黑帽=闭运算-原始输入(原始的小轮廓)BLACKHAT
#礼帽=原始输入-开运算(原始的杂纹=原始-无杂纹)
img= cv2.imread('dige.png')
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
#黑帽=闭运算-原始输入(原始的小轮廓)
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
相关文章:

【Opencv+Yolo】_Day1图像基本处理
目录 一、计算机中的视觉: 二、Opencv基本操作: 图片基础处理: 视频基本处理: 图像截取(截取,合并,只保留一个元素) 图像填充 数值计算 图像融合 阈值判断 图像平滑 图像腐…...
MySQL各种日志类型介绍
概述 MySQL 提供了多种日志类型,用于记录数据库的运行状态、操作历史和错误信息等,这些日志对于故障排查、性能优化、安全审计和数据恢复等具有重要作用。以下是 MySQL 中常见的日志类型及其详细介绍资料已经分类整理好:https://pan.quark.c…...
15.2【基础项目】使用 TypeScript 实现密码显示与隐藏功能
在现代 Web 应用中,允许用户切换密码的可见性不仅提升了用户体验,也让表单填写更便捷。使用 TypeScript 来实现这个功能,不仅具备强类型检查优势,还能提升代码的可维护性。 ✨ 我们要实现的功能 在这篇文章中,我们将…...
Django压缩包形式下载文件
通过web将minio上的文件以压缩包-文件夹-文件的形式下载到本地 import os from bx_mes import settings from io import BytesIO import zipfile from django.http import StreamingHttpResponse class FileRemote(GenericAPIView):def post(self,request):# 压缩包名folder_n…...
晚期NSCLC临床试验终点与分析策略
1. 案例背景 1.1 研究设计 1.1.1 适应症与分组 晚期非小细胞肺癌一线治疗,干预组为新型免疫检查点抑制剂联合化疗,对照组为化疗单药,随机双盲安慰剂对照III期试验。 1.1.2 目标框架 基于FDA或ICH指南,终点定义和分析策略影响试验科学性及监管审评。 2. 终点定义 2.1 主要…...

从比分滚动到数据革命:体育数据如何重构我们的观赛体验?
当凌晨三点的欧冠决赛与闹钟冲突时,当世界杯小组赛因时差难以全程跟进时,当代体育迷早已不再依赖电视直播 —— 打开手机里的比分网,实时跳动的体育大数据正构建着全新的观赛宇宙。这些曾经被视为 "辅助工具" 的平台,如…...

华为网路设备学习-23(路由器OSPF-LSA及特殊详解 二)
OSPF动态路由协议要求: 1.必须有一个骨干区域(Area 0)。有且仅有一个,而且连续不可分割。 2.所有非骨干区域(Area 1-n)必须和骨干区域(Area 0)直接相连,且所有区域之间…...

VPet虚拟桌宠,一款桌宠软件,支持各种互动投喂等. 开源免费并且支持创意工坊
📌 大家好,我是智界工具库,每天分享好用实用且智能的开源项目,以及在JAVA语言开发中遇到的问题,如果本篇文章对您有所帮助,请帮我点个小赞小收藏小关注吧,谢谢喲!😘 工具…...

新书速览|ASP.NET MVC高效构建Web应用
《ASP.NET MVC高效构建Web应用》 本书内容 《ASP.NET MVC高效构建Web应用》以目前流行的ASP.NET MVC 5、HTML和Razor为主线,全面系统地介绍ASP.NET MVC Web应用开发的方法,配套提供实例源码、PPT课件与作者一对一QQ答疑服务。 《ASP.NET MVC高效构建Web…...

MySQL 9.3 超详细下载安装教程(Windows版)附图文说明
MySQL 9.3 超详细下载安装教程(Windows版)附图文说明 💡 本文适用于Windows 10/11系统,包含完整的安装流程、环境配置和疑难解答。建议收藏备用! 一、下载MySQL 1. 访问官网 进入MySQL官方下载页面:http…...

Linux之软件包管理器(CentOS系统) —— yum
目录 一、软件包管理器 1-1什么是软件包 1-2 Linux软件生态 Linux下载软件的过程(Ubuntu、Centos、other) 操作系统的好坏评估---生态问题 1. 应用软件生态 2. 硬件兼容性 3. 开发者社区与开源生态 4. 商业合作与盈利模式 5. 用户粘性与使用习惯 6. 安全与合规生态 …...

webpack吐环境分析
需要解决的问题 扣取下来的webpack文件过大 解决思路 用ast将需要的代码扣下来 结果展示 实现步骤 第一步:我们得知道需要哪些模块 在入口处,增加模块记录 第二步,分析ast代码 通过分析发现,key 有三种值 分别为NumbericLiteral、StringLi…...

Unity InputField 滑动滚轮 实现对文本的滚动
一。效果演示: 二。实现原理: 创建一个脚本KeInputScroll.cs 继承InputField类和IScrollHandler接口。如下面代码所示: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class KeInputScroll : InputFiel…...

机械设计插件
在进行机械设计的时候,很多厂家对我们开放了外购件的模型,方便我们进行设计选购,但是尽管如此,我们在使用的时候还是很麻烦,我目前使用的是Part data manager来管理这些厂家的模型,使用方法非常简单。 首先…...
Monorepo 管理
以下是设计可扩展的前端架构(Monorepo 管理)的核心知识点总结: 一、Monorepo 的核心概念与优势 1. 什么是 Monorepo? 定义:将多个相关项目(包、应用、库)存储在一个代码仓库中的代码管理模式。对比 Multirepo:传统每个项目独立仓库,Monorepo 统一管理依赖、配置和工具…...

RabbitMQ核心机制——延迟队列
一、 什么是延迟队列? 消息发送之后,不想让消费者马上收到消息,而是等待特定时间后消费者才能拿到这条消息进行消费。 二、 如何实现延迟队列 RabbitMQ并没有直接支持延迟队列这一功能,如果需要实现延迟队列,有两种方法…...

华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent
前引:重磅来袭!本次以DeepSeek-V3/R1商用大模型和Dify-LLM应用平台一键部署为核心,专为新手打造“开箱即用”的AI开发体验。无论你是想快速搭建企业级AI应用,还是探索大模型落地的无限可能,只需跟随小编实现三步走&…...
IP 网段
以下是关于 IP 网段 的详细解析,涵盖基本概念、表示方法、划分规则及实际应用场景: 一、网段核心概念 1. 什么是网段? 网段指一个逻辑划分的 IP 地址范围,属于同一子网的设备可以直接通信(无需经过路由器)…...
芋道框架 - 接口设置匿名访问
芋道框架 - 接口设置匿名访问 在芋道(yudao)框架中,有些接口需要开放给外部访问,例如文件上传、验证码获取等。要实现接口的匿名访问,主要有两个步骤: 1. 在接口上添加 PermitAll 在需要匿名访问的接口方…...
熔盐核裂变反应堆:第四代核能技术的重要突破
在核能技术的演进历程中,第四代核能系统被寄予厚望,代表着更高的效率、更强的安全性和更广泛的资源适应能力。近年来,熔盐反应堆技术作为其中最具挑战性和变革性的方案之一,逐步走向工程化与实用化阶段。其中,液态燃料…...
鸿蒙OSUniApp 实现的日期选择器与时间选择器组件#三方框架 #Uniapp
UniApp 实现的日期选择器与时间选择器组件 在移动应用开发中,日期选择器和时间选择器是表单、预约、日程、打卡等场景中不可或缺的基础组件。一个好用的日期/时间选择器不仅能提升用户体验,还能有效减少输入错误。随着 HarmonyOS(鸿蒙&#…...
Linux云计算训练营笔记day16(Linux周期性计划任务、Python)
Linux云计算训练营笔记day16(Linux周期性计划任务、Python) 目录 Linux云计算训练营笔记day16(Linux周期性计划任务、Python)1.Linux 周期性计划任务2.Python 1.Linux 周期性计划任务 周期性计划任务 用途: 按照设置的时间间隔,为…...
对比Redis与向量数据库(如Milvus)在AI中的应用
对比Redis与向量数据库(如Milvus)在AI中的应用 在AI架构中,缓存系统的设计直接影响响应速度、资源成本以及推理路径是否高效。而面对不同的AI业务诉求,选用什么类型的缓存系统、如何搭配,往往是系统架构设计中必须深入…...

【Elasticsearch入门到落地】13、DSL查询详解:分类、语法与实战场景
接上篇《12、索引库删除判断以及文档增删改查》 上一篇我们讲解了如何判断索引库是否存在并删除它,以及如何对索引库中的文档进行增删改查操作。本篇我们进入ElasticSearch的DSL语法的详解。 Elasticsearch(ES)作为强大的分布式搜索引擎&…...

[欠拟合过拟合]机器学习-part10
7.欠拟合过拟合 7.1欠拟合 欠拟合是指模型在训练数据上表现不佳,同时在新的未见过的数据上也表现不佳。这通常发生在模型过于简单,或者是训练的次数不够,无法捕捉数据中的复杂模式时。欠拟合模型的表现特征如下: 训练误差较高。 …...

【windwos】文本编辑器Notepad++ 替代品Notepad--
一、N和N--对比介绍 曾经备受推崇的「Notepad」曾是Windows上的经典代码编辑器。然而,作者的一些政治言论已经让它被广大中国用户抛弃。 一个名为「Notepad--」的新编辑器,也是开源免费,功能和实用性也在尽可能接近。与此同时,「N…...

Linux基本指令篇 —— clear指令
clear 是 Linux 和 Unix 系统中用于清空终端屏幕的常用命令。它的作用是移除当前终端窗口中的所有可见内容,提供一个干净的界面,类似于“刷新”终端。以下是关于 clear 的详细解析: 目录 1. 基本用法 2. 实现原理 3. 常见场景 场景 1&…...
Anaconda 的基础教程,从入门到精通
以下是Anaconda的基础教程,从入门到精通: 一、Anaconda简介 Anaconda是一个用于科学计算的Python/R发行版,集成了1000+常用数据科学包,提供环境管理功能,解决包依赖冲突问题。适合数据科学、机器学习、深度学习等领域。 二、安装与配置 1. 下载与安装 官网下载:Anaco…...

阿里云DDoS防护:万一被“黑”了,如何更换IP地址?
阿里云DDoS防护:万一被“黑”了,如何更换IP地址“绝地反击”? 各位站长、运维老铁、业务负责人们,大家好!在如今这个网络世界,最让人提心吊胆的,莫过于遭遇**DDoS攻击(分布式拒绝服…...
机器学习笔记【Week2】
一、多变量线性回归(Multivariate Linear Regression) 为什么需要多变量? 现实问题中,一个目标可能受多个因素影响,比如预测房价时: x 1 x_1 x1:面积 x 2 x_2 x2:卧室数量 x 3…...