当前位置: 首页 > news >正文

opencv图像的直方图,二维直方图,直方图均衡化

文章目录

    • opencv图像的直方图,二维直方图,直方图均衡化
      • 一、图像的直方图
        • 1、什么是图像的直方图:
        • 2、直方图的作用:
        • 3、如何绘制图像的直方图:
          • (1)cv::calcHist()函数原型:英文单词 calculator histogram
          • (2)代码示例:
            • cv::cvRound()函数:将浮点数值四舍五入为最接近的整数;
            • 灰度图像直方图:
            • 彩色图像直方图:
      • 二、二维直方图
        • 1、什么是二维直方图:
        • 2、二维直方图与直方图有哪些不同:
        • 3、二维直方图的作用:
        • 4、如何绘制二维直方图:
      • 三、直方图均衡化
        • 1、直方图均衡化的原理:
        • 2、opencv中,可以使用 `cv::equalizeHist()`函数来实现直方图均衡化:
          • (1)cv::equalizeHist()函数原型:
          • (2)代码示例:
            • 灰度直方图均衡化:
            • 彩色直方图均衡化:

opencv图像的直方图,二维直方图,直方图均衡化

一、图像的直方图

1、什么是图像的直方图:
  • 要理解直方图,绕不开“亮度”这个概念,人们把亮度分为0到255共256个数值,数值越大,代表的亮度越高,其中0代表纯黑色,最暗区域,255表示最亮,纯白色,而中间的数字就是不同亮度的灰色;
  • 图像的直方图是一种统计图,它显示了图像中各个灰度级别的分布情况(也就是统计一幅图某个亮度像素的数量),通常它的横轴代表像素的灰度级别(从0到255),而纵轴代表该灰度级别在图像中出现的频次或概率;
2、直方图的作用:
  • 可视化图像亮度分布:直方图能够帮助我们直观地了解图像的亮度分布情况,从而为图像处理提供重要参考;
  • 对比度调整:通过观察直方图,我们可以确定图像的对比度是否合适,从而决定是否需要进行对比度调整;
  • 灰度级别选择:直方图可以帮助我们选择合适的灰度级别,以使图像的细节更加清晰;
3、如何绘制图像的直方图:

在opencv中,可以使用 cv::calcHist()函数来计算图像的直方图,这个函数可以接受一个通道的图像(灰度图像)或多个通道的图像(彩色图像);

(1)cv::calcHist()函数原型:英文单词 calculator histogram
void cv::calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false
);参数解释:
images:输入图像,可以是单通道或多通道图像;
nimages:输入图像的个数(可以输入多张图像);
channels:需要统计直方图的第几通道,比如{0}表示统计第一个通道,{0, 1, 2}表示统计所有三个通道;
mask:掩膜,用于指定计算直方图的区域(必须是一个8(CV_8U)的数组并且和images的数组大小相同);
hist:输出的直方图数组,calcHist函数只是计算直方图的数据,直方图数据需要一个cv::Mat类型的变量来存储;
dims:输出直方图的维度(由channels值决定dims的数值,比如int channels[] = { 0 }则dims=1int channels[] = { 0, 1 }则dims=2;对于灰度图像dims为1,因为我们只考虑了一个通道(亮度通道);对于彩色图像,通常会考虑多个通道,比如在HSV色彩空间中,dims为2(H和S两个通道) 
);
histSize:指的是直方图横坐标分成多少个区间,就是bin的个数(用于控制直方图的精细度);
把直方图横坐标ranges分成histSize个区间(比如ranges=180,histSize=30,则横坐标被分成了30个小竖条,每个小竖条的长度为6);
ranges:横轴代表像素的灰度级别,ranges相当于横坐标的取值范围(对于灰度图像,单通道只有1个range,灰度级别的范围从0255(int bins = 256;               		// X轴被分成了256个小区间int histSize[] = { bins };   		// histSize只有1个binsfloat xRanges[] = { 0, 256 }; 		// X轴的取值范围const float* ranges[] = { xRanges };    // ranges只有1个);对于彩色图像有多个通道就有多个range,对于每个通道,ranges指定了取值范围,通常在彩色图像中,H(色相)的范围是0180S(饱和度)V(明度)的范围是0255(// H通道X轴被分成了30个小区间,S通道X轴被分成了32个小区间int hueBins = 30, satBins = 32;	  int histSize[] = { hueBins, satBins };			// histSize有2个binsfloat hueRanges[] = { 0, 180 };				// H通道X轴的取值范围float satRanges[] = { 0, 256 };				// S通道X轴的取值范围const float* ranges[] = { hueRanges, satRanges };    	// ranges有2个));
uniform:是否对得到的直方图数组进行归一化处理;
accumulate:在多个图像时,是否累积计算像素值的个数;
(2)代码示例:
cv::cvRound()函数:将浮点数值四舍五入为最接近的整数;
// 函数在图像处理过程中经常用于处理像素值,特别是当需要将浮点数转换为整数时,可以保留最接近的整数值
int cvRound(double value)参数解释:
value:待四舍五入的浮点数;
灰度图像直方图:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取灰度图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy2.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}// 直方图计算的输出值,是一个cv::Mat对象cv::Mat hist;// X轴被分成了256个小区间int bins = 256;// 灰度图只有1个ranges,所以histSize跟要ranges对应,定义成1个int histSize[] = { bins };// X轴的取值范围float xRanges[] = { 0, 256 };// 在C++中,数组名本身就代表该数组的首地址,无需使用取地址符号&,// const float* ranges = xRanges;const float* ranges[] = { xRanges };// 我们要计算灰度图像的第0个通道,所以这里channels定义成{0}int channels[] = { 0 };calcHist(&image, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);// 待绘制的目标图像,将直方图计算的输出值hist,绘制到histImage图像上int histWidth = 512, histHeight = 400;int binWidth = cvRound( (double)histWidth/bins );cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));// 使用normalize()函数将直方图的值缩放到图像的高度范围内normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());// 使用cv::line()函数绘制直线for (int i = 1; i<bins; i++) {cv::line(histImage,Point(binWidth*(i - 1), histHeight - cvRound(hist.at<float>(i - 1))),Point(binWidth*(i), histHeight - cvRound(hist.at<float>(i))),Scalar(255, 0, 0),2,LINE_8,0);}// 显示图像和直方图cv::imshow("Image", image);cv::imshow("Histogram", histImage);waitKey();return 0;
}

运行结果:
在这里插入图片描述

彩色图像直方图:

对于彩色图像,你可以分别计算其颜色通道(蓝色、绿色、红色)的直方图,或者将其转换为灰度图像后计算整体的亮度直方图;

在这个示例中,我们首先读取了一个彩色图像,然后使用 cv::split() 函数将图像分离成蓝色、绿色和红色通道,接着,我们分别计算了每个通道的直方图,最后我们绘制了各个通道的直方图并显示了原始图像和直方图;

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy2.jpg");if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}// 分离通道std::vector<cv::Mat> bgrPlanes;cv::split(image, bgrPlanes);// 直方图计算的输出值,是一个cv::Mat对象cv::Mat bHist, gHist, rHist;int bins = 256;	// B,G,R通道,X轴都被分成了256个小区间// B通道直方图计算// B通道,灰度图只有1个ranges,所以histSize跟要ranges对应,定义成1个int bHistSize[] = { bins };// B通道,X轴的取值范围,亮度级别float bXRanges[] = { 0, 256 };// 在C++中,数组名本身就代表该数组的首地址,无需使用取地址符号&,// const float* ranges = bXRanges;const float* bRanges[] = { bXRanges };// 图像通道被分离后,B通道图像只有一个通道,第0个通道,所以这里channels定义成{0}int bChannels[] = { 0 };calcHist(&bgrPlanes[0], 1, bChannels, Mat(), bHist, 1, bHistSize, bRanges, true, false);// G通道直方图计算// G通道,灰度图只有1个ranges,所以histSize跟要ranges对应,定义成1个int gHistSize[] = { bins };// G通道,X轴的取值范围,亮度级别float gXRanges[] = { 0, 256 };// 在C++中,数组名本身就代表该数组的首地址,无需使用取地址符号&,// const float* ranges = gXRanges;const float* gRanges[] = { gXRanges };// 图像通道被分离后,G通道图像只有一个通道,第0个通道,所以这里channels定义成{0}int gChannels[] = { 0 };calcHist(&bgrPlanes[1], 1, gChannels, Mat(), gHist, 1, gHistSize, gRanges, true, false);// R通道直方图计算// R通道,灰度图只有1个ranges,所以histSize跟要ranges对应,定义成1个int rHistSize[] = { bins };// R通道,X轴的取值范围,亮度级别float rXRanges[] = { 0, 256 };// 在C++中,数组名本身就代表该数组的首地址,无需使用取地址符号&,// const float* ranges = rXRanges;const float* rRanges[] = { rXRanges };// 图像通道被分离后,R通道图像只有一个通道,第0个通道,所以这里channels定义成{0}int rChannels[] = { 0 };calcHist(&bgrPlanes[2], 1, rChannels, Mat(), rHist, 1, rHistSize, rRanges, true, false);// 绘制直方图int histWidth = 512, histHeight = 400;int binWidth = cvRound( (double)histWidth/bins );cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));normalize(bHist, bHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());normalize(gHist, gHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());normalize(rHist, rHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());for (int i = 1; i<bins; i++) {// 绘制蓝色分量直方图cv::line(histImage,cv::Point( binWidth*(i-1), histHeight-cvRound( bHist.at<float>(i-1) ) ),cv::Point( binWidth*(i), histHeight-cvRound( bHist.at<float>(i) ) ),cv::Scalar(255, 0, 0),2,LINE_8,0);// 绘制绿色分量直方图cv::line(histImage,cv::Point( binWidth*(i - 1), histHeight-cvRound( gHist.at<float>(i-1) ) ),cv::Point( binWidth*(i), histHeight-cvRound( gHist.at<float>(i) ) ),cv::Scalar(0, 255, 0),2,LINE_8,0);// 绘制红色分量直方图cv::line(histImage,cv::Point( binWidth*(i - 1), histHeight-cvRound( rHist.at<float>(i-1) ) ),cv::Point( binWidth*(i), histHeight-cvRound( rHist.at<float>(i) ) ),cv::Scalar(0, 0, 255),2,LINE_8,0);}// 显示图像和直方图cv::imshow("Image", image);cv::imshow("Histogram", histImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

二、二维直方图

1、什么是二维直方图:

二维直方图是对彩色图像进行分析时的一个重要工具,与一维直方图不同,它同时考虑了两个通道的信息,通常是颜色空间中的两个分量,例如在HSV色彩空间中的H(色相)和S(饱和度);

2、二维直方图与直方图有哪些不同:
  • 维度:直方图是一维的,它只考虑了图像的亮度或色彩信息;而二维直方图考虑了两个通道的信息,因此是二维的;
  • 通道:直方图通常只针对一个通道(灰度图只有亮度通道);而二维直方图可以同时考虑多个通道,通常是颜色空间中的两个分量;
3、二维直方图的作用:
  • 颜色分布分析:通过二维直方图,我们可以了解图像中各个颜色组合的分布情况,有助于理解图像的颜色特性;
  • 图像分割与对象识别:在图像分割和对象识别任务中,二维直方图可用于将图像的颜色特征映射到特定的空间,从而实现对图像中的对象进行定位和识别;
  • 颜色调整与匹配:通过分析二维直方图,我们可以进行颜色调整,使图像的颜色分布更加符合预期;
4、如何绘制二维直方图:

首先读取了一个彩色图像,然后将其从BGR颜色空间转换为HSV颜色空间,接着我们分离了H和S通道,并指定了直方图的维度、通道数、亮度级别个数和范围,然后我们使用 cv::calcHist()计算了二维直方图并使用 cv::rectangle()绘制;

#include <opencv2\opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy2.jpg");if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}// 2D 直方图Mat hsv, hist;cvtColor(image, hsv, COLOR_BGR2HSV);// H通道X轴被分成了30个小区间,S通道X轴被分成了32个小区间int hueBins = 30, satBins = 32;// 彩色图像有多个ranges,所以histSize跟ranges对应也要定义多个,定义成数组的形式int histSize[] = { hueBins, satBins };float hueRanges[] = { 0, 180 };	// H通道X轴的取值范围float satRanges[] = { 0, 256 };	// S通道X轴的取值范围// 彩色图像有多个ranges,定义成数组的形式const float* ranges[] = { hueRanges, satRanges };// 我们要计算HSV图像的第0个通道和第1个通道的直方图,所以这里channels也要定义多个int channels[] = { 0, 1 };calcHist(&hsv, 1, channels, Mat(), hist, 2, histSize, ranges, true, false);// 画出计算后的直方图double maxVal = 0;minMaxLoc(hist, 0, &maxVal, 0, 0);int scale = 10;Mat histImage = Mat::zeros(satBins*scale, hueBins*scale, CV_8UC3);for (int h=0; h<hueBins; h++) {for (int s=0; s<satBins; s++){float binVal = hist.at<float>(h, s);int intensity = cvRound( binVal*255 / maxVal );rectangle(histImage, Point( h*scale, s*scale ),Point( (h+1)*scale - 1, (s+1)*scale - 1 ),Scalar::all(intensity),-1);}}applyColorMap(histImage, histImage, COLORMAP_JET);imshow("Image", image);imshow("H-S Histogram", histImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

三、直方图均衡化

直方图均衡化是一种用于增强图像对比度的图像处理技术,它通过重新分配图像的像素值,使得整个亮度范围得到充分利用,从而使图像看起来更清晰和具有更好的对比度;

1、直方图均衡化的原理:
  • 计算直方图:首先计算原始图像的灰度直方图,这个直方图描述了图像中各个灰度级别的分布情况;
  • 计算累积分布函数(CDF):将灰度直方图转换为累积分布函数,CDF表示了每个灰度级别的累积概率;
  • 映射新的像素值:对于每个像素,将其原始灰度值映射到新的值,使得新的值在整个亮度范围内均匀分布;
2、opencv中,可以使用 cv::equalizeHist()函数来实现直方图均衡化:
(1)cv::equalizeHist()函数原型:
void cv::equalizeHist(InputArray src, OutputArray dst
);参数解释:
src:输入图像(灰度图像);
dst:输出图像,用于存储均衡化后的结果;
(2)代码示例:
灰度直方图均衡化:
#include <opencv2\opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取灰度图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy2.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}// 均衡化灰度直方图cv::Mat equalizedImage;cv::equalizeHist(image, equalizedImage);cv::imshow("Original Gray Image", grayImage);cv::imshow("Equalized Gray Image", equalizedImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

彩色直方图均衡化:

首先将彩色图像转换为HSV色彩空间,然后对亮度(Value/V通道)进行均衡化,最后将其转换回BGR色彩空间以显示

#include <opencv2\opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy2.jpg", cv::IMREAD_COLOR);if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}// 将图像从BGR色彩空间转换为HSV色彩空间cv::Mat hsvImage;cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);// 均衡化HSV通道的直方图std::vector<cv::Mat> channels;cv::split(hsvImage, channels);cv::equalizeHist(channels[2], channels[2]);cv::Mat equalizedHSV;cv::merge(channels, equalizedHSV);cv::cvtColor(equalizedHSV, equalizedHSV, cv::COLOR_HSV2BGR);cv::imshow("Original Color Image", image);cv::imshow("Equalized Color Image", equalizedHSV);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

相关文章:

opencv图像的直方图,二维直方图,直方图均衡化

文章目录 opencv图像的直方图&#xff0c;二维直方图&#xff0c;直方图均衡化一、图像的直方图1、什么是图像的直方图&#xff1a;2、直方图的作用&#xff1a;3、如何绘制图像的直方图&#xff1a;&#xff08;1&#xff09;cv::calcHist()函数原型&#xff1a;英文单词 calc…...

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…...

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…...

ToBeWritten之车联网安全中常见的TOP 10漏洞

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

软考-密码学概述

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 密码学基本概念 密码学的主要目的是保持明文的秘密以防止攻击者获知&#xff0c;而密码分…...

windows 2003、2008远程直接关闭远程后设置自动注销会话

1、2003系统&#xff1a; 按开始—运行—输入“tscc.msc”&#xff0c;打开“终端服务配置”。 单击左边窗口的“连接”项&#xff0c;右边窗口中右击“RDP-TCP”&#xff0c;选择“属性”。 单击“会话”项&#xff0c;勾选“替代用户设置”&#xff0c;在“结束已断开的会话”…...

iOS BUG UIView转UIImage模糊失真

iOS BUG UIView转UIImage模糊失真 ##UIView转成Image - (UIImage *)capture {UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);[self.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *img UIGraphicsGetImageFromCurrentImageContext(…...

如何在10分钟内让Android应用大小减少 60%?

一个APP的包之所以大&#xff0c;主要包括一下文件 代码libso本地库资源文件&#xff08;图片&#xff0c;音频&#xff0c;字体等&#xff09; 瘦身就主要瘦这些。 一、打包的時候刪除不用的代码 buildTypes {debug {...shrinkResources true // 是否去除无效的资源文件(如…...

网络代理技术:保障隐私与增强安全

在当今数字化的世界中&#xff0c;网络代理技术的重要性日益凸显。无论您是普通用户还是网络工程师&#xff0c;了解如何使用代理技术来保护隐私和增强网络安全都是至关重要的。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和隐私保护中的关键作用。 1. Socks5代理&am…...

数据结构 | (二) List

什么是 List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable 也是一个接口&#xff0c;表示实现该接口的类是可以逐个…...

[NewStarCTF 2023 公开赛道] week1 Crypto

brainfuck 题目描述&#xff1a; [>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<-]>>>>>>>.>----.<-----.>-----.>-----.<<<-.>>..…...

C语言中文网 - Shell脚本 - 0

教程目录如下&#xff1a; 第1章 Shell基础&#xff08;开胃菜&#xff09; 1. Shell是什么&#xff1f;1分钟理解Shell的概念&#xff01; 2. Shell是运维人员必须掌握的技能 3. 常用的Shell有哪些&#xff1f; 4. 进入Shell的两种方式 5. Linux Shell命令的基本格式 6.…...

Transformer预测 | Pytorch实现基于Transformer 的锂电池寿命预测(CALCE数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…...

2023年【通信安全员ABC证】找解析及通信安全员ABC证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 通信安全员ABC证找解析参考答案及通信安全员ABC证考试试题解析是安全生产模拟考试一点通题库老师及通信安全员ABC证操作证已考过的学员汇总&#xff0c;相对有效帮助通信安全员ABC证考试总结学员顺利通过考试。 1、【…...

前端框架Vue2.0+Vue3.0学习笔记01

一、Vue技术_课程简介 1、前端框架小白 2、熟练掌握Vue2 3、轻松玩转Vue3 ①、vue基础 ②、vue-cli ③、vue-router ④、vuex ⑤、element-ui ⑥、vue3 二、Vue技术_Vue简介 1、Vue是什么&#xff1f; 一套用于构建用户界面&#xff08;把你拿到手里的数据&#xf…...

iOS App上架全流程及相关处理

iOS app上架总体流程&#xff1a; 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP&#xff0c;上线成功 1、申请开发者账号 苹果开发者账号主要分为三种&#xff1a;个人账号、公司账号、企业账…...

解决WordPress升级后提示:无需升级,您的WordPress数据库已经是最新的了

问题描述 当升级了 WordPress 6.3 后&#xff0c;登录后台出现了提示&#xff1a;无需升级&#xff0c;您的WordPress 数据库已经是最新的了。并且无法进入后台了。 出现这个问题的原因可能是你网站开启了 Memcached 缓存。 如何验证是否开启了 Memcached 缓存&#xff1f;检…...

springcloud之项目实战搭建单体

写在前面 在上篇文章 中我们介绍了项目的整体内容以及架构&#xff0c;本文就开始实现一个单体的版本&#xff0c;在之后的文章中&#xff0c;在使用springcloud相关组件将这个单体的版本一步步的拆分为微服务的版本&#xff0c;在开始之前再贴下组件图&#xff1a; 本文我们分…...

Mac 点击桌面 出现黑边框 解决

1、桌面黑框效果 2、解决&#xff1a;设置为 仅在台前调度中...

深度学习(2)---循环神经网络(RNN)

文章目录 一、序列数据和语言模型1.1 序列数据1.2 语言模型 二、循环神经网络(RNN)2.1 概述2.2 门控循环单元(GRU)2.3 长短期记忆网络(LSTM) 一、序列数据和语言模型 1.1 序列数据 1. 在深度学习中&#xff0c;序列数据&#xff08;Sequence data&#xff09;是指具有前后顺序…...

[NOIP2010 提高组] 机器翻译

[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xf…...

配置文件生成器-秒杀SSM的xml整合

配置文件生成器-秒杀SSM的xml整合 思路&#xff1a; 通过简单的配置&#xff0c;直接生成对应配置文件。 maven坐标 <dependencies><!-- 配置文件生成 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker<…...

小黑开始了拉歌训练,第一次进入部室馆,被通知要去当主持人心里有些紧张的leetcode之旅:337. 打家劫舍 III

小黑代码&#xff08;小黑卡在了bug中&#xff0c;上午一步步探索做出&#xff0c;非常NB!!!&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left lef…...

flutter开发实战-inappwebview实现flutter与Javascript方法调用

flutter开发实战-inappwebview实现flutter与Javascript方法调用 在使用inappwebview时候&#xff0c;需要flutter端与JS进行交互&#xff0c;调用相应的方法&#xff0c;在inappwebview中的JavaScript Handlers。 一、JavaScript Handlers 要添加JavaScript Handlers&#…...

alsa pcm设备之硬件参数

硬件参数包含了stream描述比如格式,采样率,通道数,和ringbuffer 圆形缓存区大小等. 使用snd_pcm_hw_params_t ,ALSA pcm设备使用了参数重定义系统相关的硬件参数,应用程序首先选择全范围的配置, 然后应用程序设置单个参数,直到所有参数都是基本的(确定的). 格式 量化位數&#…...

websocket拦截

python实现websocket拦截 前言一、拦截的优缺点优点缺点二、实现方法1.环境配置2.代码三、总结现在的直播间都是走的websocket通信,想要获取websocket通信的内容就需要使用websocket拦截,大多数是使用中间人代理进行拦截,这里将会使用更简单的方式进行拦截。 前言 开发者工…...

深度强化学习之 PPO 算法

深度强化学习之 PPO 算法 强化学习原理学习策略 基于行为价值 & 基于行为概率策略梯度算法&#xff1a;计算状态下所有行为的概率演员 - 评论家算法&#xff1a;一半基于行为价值&#xff0c;一半基于行为概率DQN 算法&#xff08;深度Q网络&#xff09;Q-Learning&#x…...

iPhone升级iOS17出现无法连接互联网的错误提示怎么办?

最新的iOS 17系统已经发布了快一个月了&#xff0c;很多人都已升级体验更多全新功能&#xff0c;但有部分用户却在升级过程中遇到一些问题&#xff1a;如无法验证更新&#xff0c;iOS17验证失败&#xff0c;因为您不再连接到互联网、 iPhone无法检查更新等错误问题。明明网络稳…...

Spring:处理@Autowired和@Value注解的BeanPostProcessor

AutowiredAnnotationBeanPostProcessor,它实现了MergedBeanDefinitionPostProcessor,因此会调用postProcessMergedBeanDefinition方法。 它实现了InstantiationAwareBeanPostProcessor,因此在属性注入时会调用postProcessPropertyValues方法 如果Autowired注解按类型找到了大…...

极坐标系下的交换积分次序

极坐标系下的交换积分次序 我把极坐标系下的交换积分次序总结为动静与静动之间的转换&#xff0c;下面通过一个例子感受一下 ρ 1 、 ρ 1 cos ⁡ θ \rho1、\rho1\cos\theta ρ1、ρ1cosθ ∫ 0 π / 2 d θ ∫ 1 1 cos ⁡ θ f ( ρ cos ⁡ θ , ρ sin ⁡ θ ) ρ d…...

跟随网站滚动的悬浮框怎么做/电商卖货平台有哪些

先上一个简单的流程示意图然后再从客户端输入用户名和密码开始说起&#xff1a;1、客户端输入用户名和密码登录渠道流程&#xff1a;1 客户端输入渠道账号user_name和密码password&#xff1b;2 登录&#xff0c;登录SDK成功之后&#xff0c;会返回一个token令牌&#xff1b;3 …...

个人网站建设流程/品牌策划ppt案例

2019独角兽企业重金招聘Python工程师标准>>> 自动更新APP代码时&#xff0c;开始用的是以下代码 Intent intent new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"Constants.SDK_DIRFile.separatorConstants.SDK_NAME)…...

天安节能科技园公司做网站/最新实时新闻

给定一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新…...

网站名重复/百度网址提交入口平台

1.首先通过&#xff0c;which java命令或whereis java命令&#xff0c;可以得到 /usr/bin/java $ which java /usr/bin/java2.执行命令 ls -lrt /usr/bin/java 得到 /usr/bin/java -> /etc/alternatives/java $ ls -lrt /usr/bin/java lrwxrwxrwx 1 root root 22 1月 17…...

开展建设文明网站活动方案/可以免费投放广告的平台

for Text1 in cat uniq1 dofor Text2 in cat uniq2doif [ "$Text1" "$Text2" ]thenecho $Text1 >> thesamefidone done...

只做彩票网站犯法吗/怎么样在百度上免费推广

说明: JavaScript的对象&#xff08;Object&#xff09;&#xff0c;本质上是键值对的集合&#xff08;Hash结构&#xff09;&#xff0c;但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。 为了解决这个问题&#xff0c;ES6提供了Map数据结构。它类似于对象&…...