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

docker-compose部署kafka服务时如何同时允许内外网访问?
背景 最近在学习kafka相关知识,需要搭建自己的kafka环境。综合考虑后决定使用docker-compose来管理维护这个环境。 docker-compose.yml Bitnami的yml文件就很不错,这里直接拿来用了。 version: "2"services:zookeeper:image: docker.io/bi…...

数据结构刷题(二十):17电话号码的字母组合、39组合总和、40组合总和II
一、电话号码的字母组合题目链接思路:回溯三部曲。确定回溯函数参数:题目中给的 digits,还要有一个参数就是int型的index(记录遍历第几个数字,就是用来遍历digits的,同时也代表了递归的深度)&am…...

Java面试总结(五)
sleep() 方法和 wait() 方法对比 相同点 两者都可以暂停线程的执行;两者都可以响应中断。 不同点 sleep()方法不会释放锁,wait()方法会释放锁; sleep()方法主要用于暂停线程的执行,wait()方法主要用于线程之间的交互/通信&…...

三维人脸实践:基于Face3D的渲染、生成与重构 <二>
face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 3DMM方法,基于平均人脸模型,可广泛用于基于关键点的人脸生成、位姿检测以及渲染等,能够快速实现人脸建模与渲染。推…...

在linux上部署Java项目
在Linux部署Java环境 要是想要部署java web程序,首先要配置环境 jdk tomcat mysql 安装jdk 推荐的方法是使用yum直接安装openjdk(开源的,与官方的jdk功能差不多),目前使用的最多的就是jdk8系列 yum list | grep jdk 在源上搜索所有关于jdk的文件 devel表示development的意思…...

线性表的接口
线性表的实现方式 顺序表 顺序表是一种线性表的实现方式,它是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素在物理上也相邻⁴。顺序表可以用数组来实现,它的优点是可以快速定位第几个元素,但是缺点…...

spark三种操作模式的不同点分析
通常情况下,由于mapreduce计算引擎的效率问题,大部分公司使用的基本都是hive数仓spark计算引擎的方式搭建集群,所以对于spark的三种操作方式来进行简单的分析。在日常开发中,使用最多的方式取决于具体的需求和场景。以下是每种方式的一些常见用途:Spark …...

Vue3做出B站【bilibili】 Vue3+TypeScript【快速入门一篇文章精通系列(一)前端项目案例】
本项目分为二部分 1、后台管理系统(用户管理,角色管理,视频管理等) 2、客户端(登录注册、发布视频) Vue3做出B站【bilibili】 Vue3TypeScript【快速入门一篇文章精通系列(一)前端项目…...

猜数游戏--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
实例10:猜数游戏 猜数游戏是一个古老的密码破译类、益智类小游戏,通常由两个人参与,一个人设置一个数字,一个人猜数字,当猜数字的人说出一个数字,由出数字的人告知是否猜中:若猜测的数字大于设…...

Nvidia jetson nano 部署yolov5_技术文档
Nvidia jetson nano 部署yolov5_技术文档 每天一句小姜格言:我行,我不是一般人儿 部署开始: 1、通过FileZilla,将window文件传输至jetson nano 上的nano文件夹下。 2、查看cuda 我买的jetson nano是带有配置好的镜像。系统配置…...