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

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...