OpenCV基础(一)
1.认识图像(彩色图中每一个像素点都包含三个颜色通道RGB,数值范围为0~255,0代表黑色,255代表白色)

import cv2 #opencv 读取的格式为BGRimg = cv2.imread('cat.png') #读取图像
cv2.imshow('cat', img) #显示图像img,窗口名为cat
cv2.waitKey(0) #显示并停留
print(img)
print(img.shape) # h*w*c (432, 650, 3),此时有三个通道
print(len(img)) #高
print(len(img[0])) #宽
print(len(img[0][0])) #RGB
程序一旦停止运行,图片就不会展示了,所以会出现一闪而过的窗口展示,为了让图片长时间展示出来,需要加:cv2.waitKey(0)
print(img):(输出三维列表:最外维度是高,中间维度是宽,最里面的维度是RGB)
[[[ 14 24 11][ 14 24 11][ 14 24 12]...[ 3 26 12][ 3 29 13][ 3 30 14]][[ 14 24 11][ 14 24 11][ 13 23 11]...[ 2 25 11][ 3 29 13][ 3 30 14]][[ 14 24 12][ 14 24 12][ 13 23 11]...[ 3 23 10][ 5 28 13][ 4 30 14]]...[[ 38 137 121][ 36 135 119][ 36 134 118]...[ 35 125 106][ 36 125 106][ 36 125 106]][[ 39 138 122][ 37 136 120][ 37 135 119]...[ 35 124 105][ 35 124 105][ 35 124 105]][[ 40 139 123][ 38 137 121][ 38 136 120]...[ 35 124 105][ 35 124 105][ 35 124 105]]]
print(len(img)) & print(leg(img[0])) & print(leg(img[0][0])) & print(img.shape):
432
650
3
(432, 650, 3)
2.读取灰度图


彩色图到灰色图的转化公式:B × 0.114 + G × 0.587 + R × 0.299
例:14×0.114+24×0.587+11×0.299=18.973(向下取整)
14×0.114+24×0.587+12×0.299=19.272(向下取整)
import cv2 #opencv 读取的格式为BGR# 读取灰度图
img = cv2.imread('cat.png', cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_GRAYSCALE表示读取灰度图def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留
cv_show('cat',img) #封装起来,只需传入窗口名和待显示图像
print(img.shape) # h*w (432, 650),此时只有一个通道#图像保存,将图片img保存在当前目录,名为cat2.png
cv2.imwrite('cat2.png', img)
print(img) & print(img.shape):
[[ 18 18 19 ... 19 21 22][ 18 18 18 ... 18 21 22][ 19 19 18 ... 16 20 22]...[120 118 118 ... 109 109 109][121 119 119 ... 108 108 108][122 120 120 ... 108 108 108]]
(432, 650)
3.图像截取

img2 = cv2.imread('cat.png') #读取图像
img3 = img2[0:200, 0:300] #高200像素,宽300像素def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留cv_show('cat',img3)
print(img3.shape) #(200, 300, 3)
3.1通道提取



img2 = cv2.imread('cat.png') #读取图像#只保留R通道,令B,G通道都为0,其他同理
img2[:,:,0]=0
img2[:,:,1]=0def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留cv_show('cat',img2)
4.图像融合
img2 = cv2.imread('cat.png') #读取图像
img3 = img2 + 10
print(img2[0:2,0:2,:]) #为了方便观察,只打印前两行两列的数值
print(img3[0:2,0:2,:])
可以看出在每个像素点的每个通道上都+10
[[[14 24 11][14 24 11]][[14 24 11][14 24 11]]]
[[[24 34 21][24 34 21]][[24 34 21][24 34 21]]]
如果大于255怎么办,会自动溢出:14+250-256=8,24+250-256=18...
img2 = cv2.imread('cat.png') #读取图像
img3 = img2 + 250
print(img2[0:2,0:2,:]) #为了方便观察,只打印前两行两列的数值
print(img3[0:2,0:2,:])
[[[14 24 11][14 24 11]][[14 24 11][14 24 11]]]
[[[ 8 18 5][ 8 18 5]][[ 8 18 5][ 8 18 5]]]
5.腐蚀与膨胀





import cv2 #opencv 读取的格式为BGR
import numpy as npimg = cv2.imread('j.png') #读取图像
kernel = np.ones((5,5), np.uint8) #设置锚框(核)大小img2 = cv2.erode(img, kernel) #erode为腐蚀操作
img2 = cv2.dilate(img, kernel) #dilate为膨胀操作img2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) #开运算
img2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) #闭运算def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留
cv_show('j', img2)
腐蚀:将锚框(核)区域中最小的值赋值给锚点,即将(0,0,0)像素值赋值给锚点,故腐蚀后黑色区域增加,白色区域减少;
膨胀:将锚框(核)区域中最大的值赋值给锚点,即将(255,255,255)像素值赋值给锚点,故膨胀后白色区域增加,黑色区域减少;
开运算:先腐蚀,再膨胀;闭运算:先膨胀,再腐蚀。
5.1梯度计算


梯度计算 = 膨胀 - 腐蚀
import cv2 #opencv 读取的格式为BGR
import numpy as npimg = cv2.imread('j.png') #读取图像kernel = np.ones((5,5), np.uint8)# imgP = cv2.erode(img, kernel) #膨胀
# imgF = cv2.dilate(img, kernel) #腐蚀
# img2 = imgF - imgP #膨胀-腐蚀img2 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) #梯度运算def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留
cv_show('j', img2)
6.Soble算子(边缘检测)




import cv2 #opencv 读取的格式为BGR
import numpy as npimg = cv2.imread('j.png') #读取图像imgx = cv2.Sobel(img, cv2.CV_64F, 1, 0, 3) #cv2.CV_64F为更高的数据类型,dx=1,dy=0,ksize=3
imgx = cv2.convertScaleAbs(imgx) #将负值转化为绝对值imgy = cv2.Sobel(img, cv2.CV_64F, 0, 1, 3) #cv2.CV_64F为更高的数据类型,dx=0,dy=1,ksize=3
imgy = cv2.convertScaleAbs(imgy) #将负值转化为绝对值def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留
cv_show('j', imgx)
cv_show('j', imgy) #同时在x,y方向上Soble
imgx_y = cv2.addWeighted(imgx, 0.5, imgy, 0.5, 0) #0.5为权重,0为偏置
cv_show('j', imgx_y)
Scharr算子(用法和Soble一样)




import cv2 #opencv 读取的格式为BGR
import numpy as npimg = cv2.imread('j.png') #读取图像imgx = cv2.Scharr(img, cv2.CV_64F, 1, 0, 3) #cv2.CV_64F为更高的数据类型,dx=1,dy=0,ksize=3
imgx = cv2.convertScaleAbs(imgx) #将负值转化为绝对值imgy = cv2.Scharr(img, cv2.CV_64F, 0, 1, 3) #cv2.CV_64F为更高的数据类型,dx=0,dy=1,ksize=3
imgy = cv2.convertScaleAbs(imgy) #将负值转化为绝对值def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留
cv_show('j', imgx)
cv_show('j', imgy) #同时在x,y方向上Soble
imgx_y = cv2.addWeighted(imgx, 0.5, imgy, 0.5, 0) #0.5为权重,0为偏置
cv_show('j', imgx_y)
Laplace算子


import cv2 #opencv 读取的格式为BGR
import numpy as npimg = cv2.imread('j.png') #读取图像img2 = cv2.Laplacian(img, cv2.CV_64F, 3) #不需要设置dx,dy
img2 = cv2.convertScaleAbs(img2)def cv_show(name,img): #定义一个函数,参数为窗口名和待显示图像cv2.imshow(name, img)cv2.waitKey(0) #显示并停留cv_show('j', img2) 相关文章:
OpenCV基础(一)
1.认识图像(彩色图中每一个像素点都包含三个颜色通道RGB,数值范围为0~255,0代表黑色,255代表白色) import cv2 #opencv 读取的格式为BGRimg cv2.imread(cat.png) #读取图像 cv2.imshow(cat, img) #显示图像img&#x…...
pinia 的使用(笔记)
文章目录1. Pinia 与 Vuex 的区别2. pinia 安装与搭建3. pinia 的使用3.1 基本使用3.2 订阅状态3.3 订阅 actions1. Pinia 与 Vuex 的区别 Pinia 是 Vue 的状态管理库,相当于 Vuex 取消了 mutations,取消了 Module 模块化命名空间现在的 pinia 采用的是…...
DolphinDB 机器学习在物联网行业的应用:实时数据异常率预警
数据异常率预警在工业安全生产中是一项重要工作,对于监控生产过程的稳定性,保障生产数据的有效性,维护生产设备的可靠性具有重要意义。随着大数据技术在生产领域的深入应用,基于机器学习的智能预警已经成为各大生产企业进行生产数…...
新建vite+vue3+ts项目,以及解决过程中遇到的问题
目录 一、新建vitevue3ts项目 二、解决过程中遇到的问题 解决报错:Module ‘“xx.vue“‘ has no default export. 解决报错:Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid’ imported from xxx的解决 解决报错:[plugin:vi…...
pyppeteer中文文档
目录 1.命令 2.环境变量 3.Launcher(启动器) 4.浏览器类 5.浏览器上下文类 6.页面类 7.Worker 类 8.键盘类 9.鼠标类 10.Tracing类 11.对话框类 12.控制台消息类 13.Frame 类 14.执行上下文类 15.JSHandle 类 16.元素句柄类…...
(二十四)操作系统-吸烟者问题
文章目录一、问题描述二、问题分析1.关系分析2.整理思路3.设置信号量三、实现四、总结一、问题描述 假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要…...
ReentranLock(可重入锁)
一、ReentranLock ReentranLock属于JUC并发工具包下的类,相当于 synchronized具备如下特点 ● 可中断 ● 可以设置超时时间 ● 可以设置为公平锁(防止线程出现饥饿的情况) ● 支持多个条件变量 与 synchronized一样,都支持可重…...
Kafka 入门 (一)
Kafka 入门(一) Apache Kafka起源于LinkedIn,后来于2011年成为开源Apache项目,然后于2012年成为First-class Apache项目。Kafka是用Scala和Java编写的。 Apache Kafka是基于发布订阅的容错消息系统。 它是快速,可扩展…...
linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)
linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项) 一、什么是内核模块 内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核添加功能。在运行时,可…...
设计模式(十七)----行为型模式之模板方法模式
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为&…...
【嵌入式Linux内核驱动】01_内核模块
内核模块 宏内核&微内核 微内核就是内核中的一部分功能放到应用层 内核小,精简,可扩展性好,安全性好 相互之间通信损耗多 内核模块 Linux是宏内核操作系统的典型代表,所有内核功能都整体编译到一起,优点是效…...
Spring——数据源对象管理和Spring加载properties文件
前面一直都是在管理自己内部创建的对象,这个是管理外部的对象。 这里先使用阿里巴巴的druid来演示。需要在pom.xml中添加如下的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1…...
Zeek安装、使用与压力测试
Zeek安装与压力测试Zeek安装、简单使用与压力测试环境Zeek安装zeek简单运行安装PF_RING修改Zeek配置文件,使用PF_RING,实现集群流量压力测试查看zeek日志Zeek安装、简单使用与压力测试 科研需要,涉及到Zeek的安装、使用和重放流量压力测试评…...
【javaEE初阶】第三节.多线程 (进阶篇 ) 死锁
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、"死锁"出现的典型场景二、产生 "死锁" 的必要条件 三、解决 "死锁" 问题的办法 总结前言 今天对于多线程进阶的学习&#…...
基于密集连接的轻量级卷积神经网络,用于使用边云架构的露天煤矿服务识别
遥感是快速检测非法采矿行为的重要技术工具。由于露天煤矿的复杂性,目前关于露天煤矿自动开采的研究较少。基于卷积神经网络和Dense Block,我们提出了一种用于从Sentinel-2遥感图像中提取露天煤矿区域的轻量级密集连接网络-AD-Net,并构建了三…...
无刷高速风筒方案介绍--【PCBA方案】
疫情三年过去,春节后,一个新的开始,大家满怀希望畅谈今年好气象。 三年来一波一波的封城、隔离、核酸,经济压抑到了无以复加的地步,也导致了诸多社会问题的出现。消费力被磨平,人们小心翼翼的生活。 常跟…...
花括号展开II[栈模拟dfs]
栈模拟dfs前言一、花括号展开II二、栈模拟dfs总结参考资料前言 递归调用,代码非常的简洁。但是可以通过显式栈来模拟栈中的内容,锻炼自己的代码能力,清楚知道栈帧中需要的内容。 一、花括号展开II 二、栈模拟dfs 每碰到一个左括号…...
神经网络分类任务(手写数字识别)
1.Mnist分类任务 网络基本构建与训练方法,常用函数解析 torch.nn.functional模块 nn.Module模块 学习方法:边用边查,多打印,duogua 使用jupyter的优点,可以打印出每一个步骤。 2.读取数据集 自动下载 %matplotl…...
FCN网络(Fully Convolutional Networks)
首个端到端的针对像素级预测的全卷积网络 原理:将图片进行多次卷积下采样得到chanel为21的特征层,再经过上采样得到和原图一样大的图片,最后经过softmax得到类别概率值 将全连接层全部变成卷积层:通常的图像分类网络最后几层是全…...
随想录二刷Day15——二叉树
文章目录二叉树2. 递归遍历二叉树3. 二叉树的迭代遍历4. 二叉树的统一迭代法二叉树 2. 递归遍历二叉树 144. 二叉树的前序遍历 class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> result;preorder(root, result);return res…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
