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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...