OpenCV图像处理——二值化原理与代码实现(C++/Python)
概述
在 OpenCV 中,二值化(Binarization)是一种图像处理操作,它的目的是将一幅灰度图像转换为仅包含两种像素值(通常为 0 和 255,分别代表黑色和白色)的二值图像。通过设定一个合适的阈值(Threshold),根据像素点的灰度值与该阈值的比较结果来确定其最终是被置为 0 还是 255,以此来突出图像中的目标物体,简化后续的图像分析、目标检测、特征提取等操作。
1 全局阈值法
原理:
这是最简单的二值化方法,对于给定的灰度图像中的每个像素点,将其灰度值与一个预先设定的固定阈值进行比较。如果像素的灰度值大于等于这个阈值,就将其赋值为一个较高的值(比如 255,表示白色);如果像素的灰度值小于阈值,就将其赋值为一个较低的值(比如 0,表示黑色)。
函数: cv2.threshold(),其基本语法如下:
ret, thresh = cv2.threshold(src, thresh, maxval, type)
参数:
- src:输入的源灰度图像,必须是单通道图像,比如通过将彩色图像转换为灰度图像后得到的数据(使用cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)进行转换)。
- thresh:设定的阈值数值,例如可以设为 127 等不同的值,具体根据图像的灰度分布和想要的效果来定。
- maxval:当像素值大于等于阈值时要赋予的最大值,一般设为 255(对应 8 位图像的白色)。
- type:阈值处理的类型,常用的有以下几种:
- cv2.THRESH_BINARY:大于等于阈值设为maxval,小于阈值设为 0,也就是常规的二值化操作。
- cv2.THRESH_BINARY_INV:与THRESH_BINARY相反,大于等于阈值设为 0,小于阈值设为maxval,实现反二值化效果。
- cv2.THRESH_TRUNC:大于阈值的像素点截断为阈值,小于阈值的保持不变。
- cv2.THRESH_TOZERO:小于阈值的像素点设为 0,大于阈值的保持不变。
- cv2.THRESH_TOZERO_INV:与THRESH_TOZERO相反,大于阈值的像素点设为 0,小于阈值的保持不变。
- ret:返回实际使用的阈值(当采用自动阈值算法时,返回自动计算出的阈值,手动指定阈值时返回传入的阈值)。
- thresh:输出的二值化后的图像数据。
2 自适应阈值法
原理:
全局阈值法中阈值是固定的,对于光照不均匀等情况效果可能不佳。自适应阈值法则会根据图像局部区域的灰度特征自动计算每个小区域的阈值,这样不同区域可以有不同的阈值,能更好地应对光照变化等情况。例如在图像较亮的区域阈值可以自动设高些,较暗区域阈值设低些。
函数: cv2.adaptiveThreshold(),语法如下:
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数:
- src:同样是输入的灰度图像。
- maxValue:与全局阈值法中的maxval类似,当像素值满足条件时赋予的最大值,常为 255。
- adaptiveMethod:自适应阈值计算的方法,有两种:
- cv2.ADAPTIVE_THRESH_MEAN_C:阈值是邻域块的平均灰度值减去常数C。
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域块的高斯加权平均灰度值减去常数C,通常对有噪声的图像效果更好。
- thresholdType:阈值处理的类型,比如cv2.THRESH_BINARY等,和全局阈值法中类似。
- blockSize:邻域块的大小,一般取奇数,例如 3、5、7 等,它决定了计算阈值时考虑的局部区域范围。
- C:从计算出的自适应阈值中减去的常数,可根据实际情况调整,用于微调阈值的大小。
- dst:输出的经过自适应阈值二值化后的图像。
3 OTSU阈值法
这里单独把OTSU阈值法做一个小节。其实只需要在全局阈值法中修改type即可。需要强调:把thresh设置为0。
3.1 图像灰度直方图:
原理:
它是一种对图像中像素灰度分布情况进行统计可视化的工具。它展示了图像中各个灰度级上像素出现的频数(或者频率),横坐标表示灰度级(通常对于 8 位灰度图像,灰度级范围是 0 - 255),纵坐标表示对应灰度级上像素的数量或者占总像素数的比例。
例如,一幅简单的灰度图像经过统计其灰度直方图后,我们就能直观地看出图像中哪种灰度值的像素比较多,哪种比较少,进而了解图像的整体明暗程度、对比度等特征。
根据图像灰度直方图,如何分析呢?
(1)如果直方图中大部分像素集中在灰度值较低的区域(接近 0),说明图像整体偏暗;反之,如果集中在较高灰度值区域(接近 255),则图像整体偏亮。
(2)均匀分布的直方图意味着图像在各个灰度级上的像素数量比较均匀,图像对比度通常较高,看起来细节更丰富;而若直方图集中在某几个灰度级上,图像对比度往往较低,显得比较 “平淡”,缺乏层次感。
(3)在图像预处理阶段,通过观察直方图可以确定是否需要进行灰度拉伸、直方图均衡化等操作来改善图像质量。例如,若图像偏暗,可以根据直方图调整其灰度分布,使图像变亮且细节更清晰。
函数:
cv2.calcHist(images, channels, mask, histSize, ranges, accumulate=False)
参数:
- images: 输入图像的列表(通常是 [img])。图像应为 numpy.ndarray 类型。
- channels: 表示要统计的通道,对于灰度图像只有一个通道,所以传入 [0];如果是彩色图像(如 BGR 格式有 3 个通道),可以分别传入 [0]、[1]、[2] 来统计蓝色、绿色、红色通道各自的直方图。
- mask: 表示图像的掩码(Mask),如果不需要使用掩码(通常情况),则传入 None;掩码可以用于只统计图像中特定区域的直方图,例如只统计图像中某个感兴趣区域内像素的灰度分布情况。
- histSize: 每个通道的直方图的维度(通常设为 [256])。
- ranges: 灰度级的范围,通常为 [0, 256]。
- accumulate: 是否累加直方图,默认为 False。
灰度图像直方图:
import cv2
import numpy as np
from matplotlib import pyplot as plt# 读取灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 计算灰度直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])# 绘制直方图
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
彩色图像直方图:
import cv2
import numpy as np
from matplotlib import pyplot as plt# 读取彩色图像
color_image = cv2.imread('image.jpg')# 分别计算 B, G, R 通道直方图
colors = ('b', 'g', 'r')
for i, color in enumerate(colors):hist = cv2.calcHist([color_image], [i], None, [256], [0, 256])plt.plot(hist, color=color)plt.title('Color Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
使用掩码计算直方图:
import cv2
import numpy as np
from matplotlib import pyplot as pltimage = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建一个圆形掩码
mask = np.zeros(image.shape, dtype=np.uint8)
center = (image.shape[1] // 2, image.shape[0] // 2)
radius = min(image.shape[:2]) // 4
cv2.circle(mask, center, radius, 255, -1)# 计算带掩码的直方图
masked_hist = cv2.calcHist([image], [0], mask, [256], [0, 256])# 显示掩码和直方图
masked_image = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('Masked Image', masked_image)
plt.plot(masked_hist)
plt.title('Masked Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 Otsu’s 方法
Otsu’s 方法,也被称为大津阈值法,是一种基于图像灰度直方图的自动阈值选取方法,由日本学者大津展之(Nobuyuki Otsu)提出。其核心目标是自动找到一个最佳阈值,将图像分为前景(目标物体)和背景两部分,使得两部分之间的类间方差最大,以此来达到最好的二值化效果。它可以通过最小化类内方差或最大化类间方差来工作。
这里只总结类间方差。
原理:
- 类间方差的概念:
- 对于一幅灰度图像,假设通过阈值 t 将其像素分为两类,一类像素灰度值小于 t,归为背景类 C 0 C_0 C0;另一类像素灰度值大于等于 t,归为前景类 C 1 C_1 C1。
- 类间方差的计算公式涉及到多个因素,主要通过计算每类像素出现的概率、平均灰度值等参数来综合得到。设图像总像素数为 N,灰度值范围是 0到 L-1(对于 8 位图像 L=256),背景类 C 0 C_0 C0 像素点数为 n 0 n_0 n0,平均灰度值为 m 0 m_0 m0;前景类 C 1 C_1 C1像素点数为 n n n_n nn,平均灰度值为 m 1 m_1 m1,图像的平均灰度值为 m G m_G mG。
- 类间方差 σ b 2 \sigma_{b}^{2} σb2 的计算公式为:
σ b 2 = w 0 × ( m 0 − m G ) 2 + w 1 × ( m 1 − m G ) 2 \sigma_{b}^{2} = w_{0} \times (m_{0} - m_{G})^{2} + w_{1} \times (m_{1} - m_{G})^{2} σb2=w0×(m0−mG)2+w1×(m1−mG)2 - 其中, w 0 w_{0} w0 和 w 1 w_{1} w1 分别是背景类和前景类像素出现的概率, w 0 = n 0 N w_{0} = \frac{n_{0}}{N} w0=Nn0, w 1 = n 1 N w_{1} = \frac{n_{1}}{N} w1=Nn1,且 w 0 + w 1 = 1 w_{0} + w_{1} = 1 w0+w1=1。
- 寻找最佳阈值的过程:
- 遍历所有可能的灰度阈值(从 0 到 L-1),针对每个阈值按照上述分类方式计算类间方差。
- 最终选择使得类间方差最大的那个阈值作为最佳阈值,因为当类间方差最大时,意味着前景和背景两类的区分度最大,也就是二值化后能最清晰地分离出目标物体和背景。
4 代码实现
Python:
import cv2
import numpy as np
import matplotlib.pyplot as pltimage = cv2.imread('your_image.jpg', 0)# 全局阈值二值化
ret, simple_thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 自适应阈值二值化(采用均值自适应方法)
adaptive_thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)# Otsu阈值二值化
ret_otsu, otsu_thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)images = [image, simple_thresh, adaptive_thresh, otsu_thresh]
titles = ['Original Image', 'Simple Thresholding', 'Adaptive Thresholding', 'Otsu Thresholding']for i in range(len(images)):plt.subplot(2, 2, i + 1)plt.imshow(images[i], cmap='gray')plt.title(titles[i])plt.axis('off')plt.show()
C++:
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 读取图像(灰度图)cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "Could not open or find the image!" << std::endl;return -1;}// 全局阈值二值化cv::Mat simple_thresh;cv::threshold(image, simple_thresh, 127, 255, cv::THRESH_BINARY);// 自适应阈值二值化(均值自适应方法)cv::Mat adaptive_thresh;cv::adaptiveThreshold(image, adaptive_thresh, 255, cv::ADAPTIVE_THRESH_MEAN_C,cv::THRESH_BINARY, 11, 2);// Otsu阈值二值化cv::Mat otsu_thresh;double otsu_thresh_val;otsu_thresh_val = cv::threshold(image, otsu_thresh, 0, 255, cv::THRESH_BINARY + cv::THRESH_OTSU);// 显示图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::namedWindow("Simple Thresholding", cv::WINDOW_NORMAL);cv::namedWindow("Adaptive Thresholding", cv::WINDOW_NORMAL);cv::namedWindow("Otsu Thresholding", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::imshow("Simple Thresholding", simple_thresh);cv::imshow("Adaptive Thresholding", adaptive_thresh);cv::imshow("Otsu Thresholding", otsu_thresh);// 打印Otsu阈值std::cout << "Otsu's Threshold: " << otsu_thresh_val << std::endl;cv::waitKey(0); // 等待用户按键return 0;
}
相关文章:
OpenCV图像处理——二值化原理与代码实现(C++/Python)
概述 在 OpenCV 中,二值化(Binarization)是一种图像处理操作,它的目的是将一幅灰度图像转换为仅包含两种像素值(通常为 0 和 255,分别代表黑色和白色)的二值图像。通过设定一个合适的阈值&…...
Scala 高阶模式案例解析:从入门到实战
引言 Scala 作为一种功能强大的多范式编程语言,因其函数式编程特性而广受欢迎。其中,高阶模式(High-Order Patterns)是 Scala 函数式编程的核心概念之一,为开发者提供了解决复杂问题的优雅方式。本篇文章将全面解析 S…...
30天学会Go--第8天 GO语言 Gin Web框架学习与实践
30天学会Go–第8天 GO语言 Gin Web框架学习与实践 文章目录 30天学会Go--第8天 GO语言 Gin Web框架学习与实践前言一、Gin 的简介与安装1.1 Gin 的特点1.2 安装 Gin 二、Gin 的基础用法2.1 路由2.1.1 基本路由2.1.2 路由参数2.1.3 查询参数2.1.4 路由分组 2.2 中间件2.2.1 使用…...
用R(语言)学R-Learning R,In R
一、安装swirl包 在R语言控制面板,对话框输入以下命令: swirl 是一个非常有用的 R 包,它允许你通过交互式教程来学习 R 语言。以下是使用 swirl 包的基本步骤: 安装 swirl 包:首先,你需要在 R 中安装 swi…...
【银河麒麟操作系统运维】某平台多台虚拟机异常重启分析及处理
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 现象描述 某虚拟化平台多台虚拟机于凌晨触发异常…...
线性代数中的谱分解
一、谱分解的基本原理 谱分解(Spectral Decomposition)是线性代数中的一个重要概念,特别是在研究矩阵的特征值和特征向量时。它指的是将一个矩阵分解为其特征值和特征向量的组合,从而简化矩阵的运算和分析。谱分解通常适用于对称…...
synchronized(juc)
目录 线程一:interrupt设计模式两阶段终止模式interrupt打断park线程 二:守护线程三:线程状态五个状态(从操作系统角度来说)六种状态(从java API的角度) 共享模型之管程一:上下文切换的安全问题临界区和竟态条件 二:synchronized解决安全问题…...
HTML Input 文件上传功能全解析:从基础到优化
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
深入理解Spring事务
目录 什么是Spring事务为什么需要Spring事务Spring事务的实现 Spring事务的传播机制Spring事务的底层原理 EnableTransactionManagement --开启Spring管理事务Import(TransactionManagementConfigurationSelector.class) --提供两个beanAutoProxyRegistrar --启用AOP的功能&am…...
React学习笔记2-初识React
这篇七个点:1 环境搭建, 2 JSX, 3 组件,4 数据流,5 生命周期,6 React与DOM,7 实例 1 环境搭建 1.1 引用React CDN <!DOCTYPE html> <html lang"en"> <head><met…...
【5G】Spectrum 频谱
频谱是移动运营商的关键资产,可用的频谱是定义移动网络容量和覆盖范围的重要因素。本章讨论了5G的不同频谱选项、它们的特性以及5G早期部署阶段的预期频谱。5G是首个旨在利用大约400 MHz到90 GHz之间所有频段的移动无线系统。5G还设计用于在许可、共享和非许可频谱带…...
解决流网络中不存在s~u~t路径的节点的最大流问题
解决流网络中不存在s~u~t路径的节点的最大流问题 问题分析伪代码C代码示例解释在流网络问题中,我们通常会假设对于所有的节点v ∈ V,都存在一条从源点s到汇点t经过v的路径。然而,当这一假设不成立时,即存在某些节点u,使得不存在路径sut,我们需要证明在这种情况下,网络中…...
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
前言 问题 1. 本地启动应用时,一切正常,但是部署 docker 后,会因为获取不到 nacos 中的配置导致服务启动失败。 2.当 docker 中的服务一直重启,可能会突然某一次启动成功,之后只要不重新构建 docker 镜像&am…...
word poi-tl 图表功能增强,插入图表折线图、柱状图、饼状图
目录 问题解决问题poi-tl介绍 功能实现引入依赖功能介绍 功能实例饼图模版代码效果图 雷达图(模版同饼图)代码效果图 柱状图(模版同饼图)代码效果图 附加CustomCharts 工具类CustomChartSingleSeriesRenderData 数据对象CustomCha…...
SpringBoot 项目如何集成 JWT
SpringBoot 项目如何集成 JWT JWT JSON Web Token (JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。 在 Oauth2 中,其实就是返回访问令牌 (access_token&#…...
如何查看电脑刷新率
Windows 系统 通过显示设置查看: 右键点击桌面空白处,选择 “显示设置”。在打开的窗口中,找到 “高级显示设置”。点击 “显示适配器属性”。在弹出的窗口中,选择 “监视器” 选项卡,即可看到当前的屏幕刷新率。使用 …...
MVC基础——市场管理系统(一)
文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…...
面向对象中多态的含义
多态性的定义 多态(Polymorphism)是面向对象编程中的一个重要概念。它是指同一个函数名或操作符在不同的对象或情境下具有不同的行为。简单来说,就是 “多种形态”。例如,在一个图形处理程序中,有 “计算面积” 这个操…...
L2G3000-LMDeploy 量化部署实践
文章目录 LMDeploy 量化部署实践闯关任务环境配置W4A16 量化 KV cacheKV cache 量化Function call LMDeploy 量化部署实践闯关任务 环境配置 conda create -n lmdeploy python3.10 -y conda activate lmdeploy conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.…...
ubuntu下的chattts 学习5:Example: self introduction
代码 import ChatTTS import torch import torchaudiochat ChatTTS.Chat() chat.load(compileFalse) # Set to True for better performance ################################### inputs_en """ chat T T S is a text to speech model designed for dialogu…...
IDEA的service窗口中启动类是灰色且容易消失
大家在学习Spring Cloud的过程中,随着项目的深入,会分出很多个微服务,当我们的服务数量大于等于三个的时候,IDEA会给我们的服务整理起来,类似于这样 但是当我们的微服务数量达到5个以上的时候,再启动服务的时候,服务的启动类就会变成灰色,而且还容易丢失 解决方法 我们按住…...
vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词
目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本, 高版本的可能浏览器不兼容或者还要考…...
Cherno C++学习笔记 P32 字符串
这篇文章我们来讲字符串。字符串可以说是最重要的变量类型了,因为对字符串的读写极大地影响到我们的程序和用户之间的交互。甚至很多很庞大的程序就只是在处理字符串。 对于字符串,我们同时需要有关于数组和指针的关系,字符串的实现与数组是…...
【C++初阶】第7课—标准模版库STL(string_1)
文章目录 1. 什么是STL2. STL六大组件3. 标准库中string类3.1 auto关键字3.2 范围for3.3 string类的类型3.4 string类的常用接口(string类对象的常见构造)3.5 string的析构和赋值运算符重载3.6 string类对象的容量操作 1. 什么是STL STL(standard template library—标准模板库…...
GESP202306 一级【时间规划】题解(AC)
》》》点我查看「视频」详解》》》 AC_Code #include <bits/stdc.h> using namespace std;int main() {int h1, m1, h2, m2;cin >> h1 >> m1;cin >> h2 >> m2;h1 h1 * 60 m1;h2 h2 * 60 m2;cout << h2 - h1;return 0; }》》》点我查…...
React基础知识四 Hooks
什么是hooks? (coderwhy) hooks是react 16.8(2019年)出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候,函数式组件是非常鸡肋的,几乎没什么用。因…...
Linux服务器通用安全加固指南
1、保护引导过程(以Grub引导为例) 在 /etc/inittab 中添加 sp:S:respawn:/sbin/sulogin,以确保当切换到单用户模式时 运行级的配置要求输入 root 密码: cp /etc/inittab / etc/initab .bak vim /etc/inittab 退出:es…...
vsphere vcenter web 界面的介绍
这是主页的页面...
分类算法中的样本不平衡问题及其解决方案
一、样本不平衡问题概述 在机器学习的分类任务中,样本不平衡是指不同类别训练样本数量存在显著差异的现象。这一差异会给模型训练和性能评估带来挑战,尤其在处理少数类样本时,模型可能难以有效学习其特征。 以二分类为例,理想情况…...
[LitCTF 2023]破损的图片(初级)
[LitCTF 2023]破损的图片(初级) 我们下载附件得到一个没有后缀的文件,拖去010看一看,发现本来应该是文件头的那部分不大对劲,结合后面四个点以及IHDR,大致也应该知道是啥了 修改第一行为png 89 50 4E 47 0D 0A 1A 0A 00 00 00 …...
最新道客巴巴怎么免费下载文档方法
一、利用浏览器插件 插件自动识别下载:对于经常需要下载道客巴巴文档的人来说,安装浏览器插件是不错的选择。如Chrome浏览器上的一些插件(如PDF在线转换器等),安装后,在浏览器中打开道客巴巴文档ÿ…...
Bert的Transformer原理
多义词如何应对: 答:通过Self attention,不同的上下文,对同一个"苹果",得到截然不同的embedding激活值; Multi-head的作用: 有些类似CNN里用的多个卷积核得到多个Channel的特征图&…...
多人聊天室 NIO模型实现
NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后,交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中,I/O多路复用是一种技术,它允许单个线程处理多个输入/输出&…...
vue.js学习(day 20)
综合案例:购物车 数据渲染 构建cart购物车模块 准备后端接口服务环境 请求数据存入vuex cart.js // 新建购物车模块 import axios from axios export default {namespaced: true,state () {return {// 购物车数据 [{},{}]list: []}},mutations: {updateList (…...
蓝桥杯二分题
P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租…...
通过 CC-Link IEFB 转 Modbus RTU 网关达成三菱 FX5U PLC 与 RS485 温湿度传感器通信的配置实例展示
一. 案例背景 在某一化工厂现场,现场的设备是三菱FX5UPLC为了避免因为工作环境存在潮湿度较高性、较高温度等对员工造成不健康或危险的现象,现决定在现场装数多台温湿度传感器。通过捷米特JM-CCLKIE-RTU网关将三菱PLC及温湿度传感器连接起来并连接上位机…...
视频质量评价算法 DOVER 使用教程
DOVER 介绍 DOVER是为ICCV2023会议论文“Exploring Video Quality Assessment on User Generated Contents from Aesthetic and Technical Perspectives”提供的官方代码、演示和权重的项目。DOVER(Disentangled Objective Video Quality Evaluator)是一个用于评估用户生成内…...
视频编辑技术:一键生成混剪视频的AI技术应用
随着视频内容的爆炸式增长,视频编辑技术也在不断进步。本文将探讨如何利用AI技术,实现一键生成混剪视频,并自动添加配音和字幕,以提高视频编辑的效率和质量。 AI技术在视频编辑中的应用 AI技术在视频编辑领域的应用越来越广泛&am…...
精确的单向延迟测量:使用普通硬件和软件
论文标题:Precise One-way Delay Measurement with Common Hardware and Software(精确的单向延迟测量:使用普通硬件和软件) 作者信息:Maciej Muehleisen 和 Mazen Abdel Latif,来自Ericsson Research Eri…...
【博士每天一篇文献-COIL算法】Co-transport for class-incremental learning
1 介绍 年份:2021 会议:2021ACM Zhou D W, Ye H J, Zhan D C. Co-transport for class-incremental learning[C]//Proceedings of the 29th ACM International Conference on Multimedia. 2021: 1645-1654. 本文提出的算法是CO-transport for clas…...
AI与BI的火花:大语言模型如何重塑商业智能的未来
大家好,我是独孤风。 在当今这个数据驱动的时代,企业对于信息的需求如同对于氧气的需求一般至关重要。商业智能(BI)作为企业获取、分析和呈现数据的关键工具,正在经历一场深刻的变革,而这一变革的催化剂正是…...
C++设计模式(建造者、中介者、备忘录)
一、建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 示例: //房子(产品类) class House { private:int rooms;int windows;string decoration; public:void setRooms(int r) {rooms …...
【数据结构】遍历二叉树
遍历二叉树的算法描述(递归定义) 先序遍历 若二叉树为空,则空操作; 否则 (1)访问根节点 (2)先序遍历左子树 (3)先序遍历右子树 中序遍历 若二叉树为空…...
鸿蒙获取 APP 信息及手机信息
前言:获取 APP 版本信息可以通过 bundleManager.getBundleInfoForSelfSync(bundleFlags) 去获取,获取手机信息可以通过 kit.BasicServicesKit 库去获取,以下是封装好的工具类。 import bundleManager from ohos.bundle.bundleManager; impo…...
OpenWRT下深入了解IPv6——SLAAC
一、SLAAC(无状态地址自动配置) 1.基本原理 SLAAC 是 IPv6 中的一种地址自动配置机制,它允许设备根据网络中的路由器通告信息和自身的 MAC 地址自动生成 IPv6 地址。在 IPv6 网络中,MAC 地址长度为 48 位,而 IPv6 地…...
UE5水文章 UI按钮样式快捷复制黏贴
shift右键拷贝 shift右键黏贴...
迭代器模式的理解和实践
引言 在软件开发中,我们经常需要遍历容器对象(如数组、列表、集合等)中的元素。如果每个容器对象都实现自己的遍历算法,那么代码将会变得冗余且难以维护。为了解决这个问题,迭代器模式应运而生。迭代器模式是一种行为型…...
Python __func 与 _func 的区别引起的思考
文章目录 __function_function深入名称修饰机制名称修饰的目的实现原理 属性访问控制的高级模式基本模式扩展复杂的转换和验证逻辑带有日志和审计的访问控制 如果突然让我说一说 Python中的__function和_function有哪些不同的约定和用途,我好像一下子没法说出很多东…...
python学opencv|读取视频(二)制作gif
【1】引言 前述已经完成了图像和视频的读取学习,本次课学习制作gif格式动图。 【2】教程 实际上想制作gif格式动图是一个顺理成章的操作,完成了图像和视频的处理,那就自然而然会对gif的处理也产生兴趣。 不过在opencv官网、matplotlib官网…...
Redmi AX3000 (RA81) 路由器恢复原厂固件
最近给Redmi AX3000 (RA81) 刷了OpenWrt固件,但是存在各种小问题,因此决定刷回原厂固件。刷机之前保证能够访问路由器ssh,否则请百度救砖教程。 准备工具 Redmi AX3000 (RA81) 原厂分区文件 [github下载地址 / csdn下载地址]小米路由器修复…...