[OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码

news2024/9/23 5:02:12

文章目录

  • 前言
  • 1.直方图均衡化的理论基础
    • (1)什么是直方图
    • (2)直方图均衡化原理
    • (3)直方图均衡化公式
  • 2.直方图比较理论基础
    • (1)相关性 (Correlation)——HISTCMP_CORREL
    • (2)卡方 (Chi-Square)——HISTCMP_CHISQR
    • (3)十字交叉性 (Intersection) ——HISTCMP_INTERSECT
    • (4)巴氏距离 (Bhattacharyya Distance)——HISTCMP_BHATTACHARYYA
  • 2.代码实现
    • (1)直方图均衡化
    • (2)直方图计算
    • (3)直方图比较
  • 4.完整代码

前言

直方图是描述图像像素值分布的重要工具,它能够帮助我们分析图像的对比度、亮度和动态范围等信息。通过直方图的比较,我们可以衡量不同图像之间的相似度,从而在图像检索、匹配等应用中发挥重要作用。本篇博客将详细介绍直方图均衡化、四种常见的直方图比较方法——相关性(Correlation)、卡方(Chi-Square)、交叉性(Intersection)和巴氏距离(Bhattacharyya),并附完整的 C++ 代码示例

1.直方图均衡化的理论基础

(1)什么是直方图

直方图是用来表示图像中每个灰度级别像素数量的分布图。通过统计图像中每个灰度值(0-255)的出现次数,可以得到图像的灰度分布情况。是图像的统计学特征。

如下图假设有图像数据8*8,像素值范围0~14共15个灰度等级,统计得到各个等级出现次数及其直方图。

在这里插入图片描述

(2)直方图均衡化原理

直方图均衡化的目标是通过重新分配图像的灰度值,使得灰度值的分布更加均匀,从而增强图像的对比度。简单来说,直方图均衡化将原来分布不均匀的直方图拉伸,使得所有的灰度值在图像中的出现概率相对均匀。

像素灰度分布从一个分布映射到另一个分布,然后再得到映射后的像素值。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=02%2525E7%25259B%2525B4%2525E6%252596%2525B9%2525E5%25259B%2525BE%2525E5%25259D%252587%2525E8%2525A1%2525A1%2525E5%25258C%252596.png&pos_id=img-Lc5Yl3kI-1727013471437
)

(3)直方图均衡化公式

s k = L − 1 M N ∑ i = 0 k h ( i ) s_k = \frac{L-1}{MN} \sum_{i=0}^{k} h(i) sk=MNL1i=0kh(i)

其中:

s k s_k sk表示均衡化后灰度值为 k k k的新灰度值;

L 是图像的灰度级别总数(通常为 256);

M和N分别是图像的宽度和高度;

h(i) 是灰度值为 ( i ) 的像素在图像中出现的次数。

这个公式将每个灰度值的累计分布映射为新的灰度值,从而使直方图更加均匀。

2.直方图比较理论基础

直方图比较的原理是通过对比两幅图像的直方图分布情况,来衡量它们的相似性。在 OpenCV 中,提供了四种常见的直方图比较方法,每种方法的原理和计算方式有所不同。

(1)相关性 (Correlation)——HISTCMP_CORREL

计算两个直方图之间的相关性,值范围为 -1 到 1,值越接近 1 表示两个直方图越相似,越接近 -1 表示它们越不相似。

d ( H 1 , H 2 ) = ∑ ( H 1 ( i ) − H 1 ˉ ) ( H 2 ( i ) − H 2 ˉ ) ∑ ( H 1 ( i ) − H 1 ˉ ) 2 ∑ ( H 2 ( i ) − H 2 ˉ ) 2 d(H_1, H_2) = \frac{\sum (H_1(i) - \bar{H_1})(H_2(i) - \bar{H_2})}{\sqrt{\sum (H_1(i) - \bar{H_1})^2 \sum (H_2(i) - \bar{H_2})^2}} d(H1,H2)=(H1(i)H1ˉ)2(H2(i)H2ˉ)2 (H1(i)H1ˉ)(H2(i)H2ˉ)

(2)卡方 (Chi-Square)——HISTCMP_CHISQR

卡方用于衡量两个直方图之间的差异,值越小表示越相似

d ( H 1 , H 2 ) = ∑ ( H 1 ( i ) − H 2 ( i ) ) 2 H 1 ( i ) d(H_1, H_2) = \sum \frac{(H_1(i) - H_2(i))^2}{H_1(i)} d(H1,H2)=H1(i)(H1(i)H2(i))2

(3)十字交叉性 (Intersection) ——HISTCMP_INTERSECT

十字交叉性通过计算两个直方图交集的大小来衡量相似性,值越大表示越相似

( H 1 , H 2 )   =   ∑ m i n   ( H 1 ( i ) , H 2 ( i ) ) (H1,H2) = ∑min (H1(i),H2(i)) (H1,H2)=min(H1(i),H2(i))

(4)巴氏距离 (Bhattacharyya Distance)——HISTCMP_BHATTACHARYYA

通过计算两个直方图之间的重叠程度来衡量相似性,值越小表示越相似

d ( H 1 , H 2 ) = 1 − 1 H 1 ˉ H 2 ˉ n 2 ∑ H 1 ( i ) H 2 ( i ) d(H_1, H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} n^2}} \sum \sqrt{H_1(i) H_2(i)}} d(H1,H2)=1H1ˉH2ˉn2 1H1(i)H2(i)

2.代码实现

直方图均衡化函数原型

void cv::equalizeHist(InputArray src, OutputArray dst)

src:输入的单通道图像,通常是灰度图像;

dst:输出的图像,即经过直方图均衡化处理后的图像。

(1)直方图均衡化

   // 读取输入图像
	Mat src = imread("lena.png", IMREAD_COLOR);
	if (src.empty()) {
		cout << "Could not open or find the image!" << endl;
		return;
	}
	// 显示原始图像
	namedWindow("Original Image", WINDOW_AUTOSIZE);
	imshow("Original Image", src);

	// 将图像转换为灰度图
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	// 进行直方图均衡化
	Mat equalizedImage;
	equalizeHist(gray, equalizedImage);

	// 显示均衡化后的图像
	namedWindow("Equalized Image", WINDOW_AUTOSIZE);
	imshow("Equalized Image", equalizedImage);

结果:

直方图均衡化后图像对比度增强
在这里插入图片描述

(2)直方图计算

计算并展示图像的蓝色、绿色和红色通道的直方图。先分离图像的三个 BGR 通道,计算每个通道的直方图,对直方图进行归一化处理,接着展示图像中三个颜色通道的像素分布情况。

/*********************直方图计算和显示*******************************/
	// 分离图像的BGR通道
	vector<Mat> bgr_planes;
	split(src, bgr_planes);

	// 定义直方图的参数
	int histSize = 256;
	float range[] = { 0, 256 };  // 灰度值范围
	const float* histRange = { range };

	Mat b_hist, g_hist, r_hist;

	// 分别计算三个通道的直方图
	calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange);
	calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange);
	calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange);

	// 归一化直方图,使得图像高度为 400 像素
	int histImageHeight = 400;
	int histImageWidth = 512;
	normalize(b_hist, b_hist, 0, histImageHeight, NORM_MINMAX);
	normalize(g_hist, g_hist, 0, histImageHeight, NORM_MINMAX);
	normalize(r_hist, r_hist, 0, histImageHeight, NORM_MINMAX);

	// 创建显示直方图的图像,大小为 512x400,背景为黑色
	Mat histImage(histImageHeight, histImageWidth, CV_8UC3, Scalar(0, 0, 0));

	// 在同一张图像上绘制蓝、绿、红三个通道的直方图
	for (int i = 1; i < histSize; i++) {
		line(histImage,
			Point((i - 1) * histImageWidth / histSize, histImageHeight - cvRound(b_hist.at<float>(i - 1))),
			Point(i * histImageWidth / histSize, histImageHeight - cvRound(b_hist.at<float>(i))),
			Scalar(255, 0, 0), 2); // 蓝色

		line(histImage,
			Point((i - 1) * histImageWidth / histSize, histImageHeight - cvRound(g_hist.at<float>(i - 1))),
			Point(i * histImageWidth / histSize, histImageHeight - cvRound(g_hist.at<float>(i))),
			Scalar(0, 255, 0), 2); // 绿色

		line(histImage,
			Point((i - 1) * histImageWidth / histSize, histImageHeight - cvRound(r_hist.at<float>(i - 1))),
			Point(i * histImageWidth / histSize, histImageHeight - cvRound(r_hist.at<float>(i))),
			Scalar(0, 0, 255), 2); // 红色
	}

	// 显示合并的直方图
	imshow("Combined BGR Histogram", histImage);

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(3)直方图比较

在 HSV 色彩空间中对三张图像的 H 和 S 通道进行直方图计算,可以使用四种方法比较它们的相似性。

#define INPUT_TITLE0 "input image src"
#define INPUT_TITLE1 "input image srctest1"
#define INPUT_TITLE2 "input image srctest2"

string convertToString(double d);
void Histogram_comparison()
{
	// 加载图像
	Mat src, srctest1, srctest2;
	src = imread("sherlock.jpg");
	srctest1 = imread("sherlock2.jpg");
	srctest2 = imread("lena.png");

	if (!src.data || !srctest1.data || !srctest2.data) {
		cout << "ERROR: Could not load image." << endl;
		return;
	}

	imshow("【src 原图】", src);
	imshow("【srctest1 原图】", srctest1);
	imshow("【srctest2 原图】", srctest2);

	// 从RGB色彩空间转换为HSV色彩空间
	cvtColor(src, src, COLOR_BGR2HSV);
	cvtColor(srctest1, srctest1, COLOR_BGR2HSV);
	cvtColor(srctest2, srctest2, COLOR_BGR2HSV);

	// 定义直方图计算所需的参数,主要是 H 和 S 两个通道
	int h_bins = 50;  // H 通道的直方图 bin 数
	int s_bins = 60;  // S 通道的直方图 bin 数
	int histSize[] = { h_bins, s_bins };

	// H 和 S 通道的取值范围
	float h_ranges[] = { 0, 180 };
	float s_ranges[] = { 0, 256 };
	const float* ranges[] = { h_ranges, s_ranges };

	// 使用 H 和 S 通道
	int channels[] = { 0, 1 };

	// MatND 是 Mat 的别名,区分经过直方图计算处理后的数据和原始图像
	MatND hist_src, hist_srctest1, hist_srctest2;

	// 计算直方图并进行归一化
	calcHist(&src, 1, channels, Mat(), hist_src, 2, histSize, ranges, true, false);
	normalize(hist_src, hist_src, 0, 1, NORM_MINMAX, -1, Mat());

	calcHist(&srctest1, 1, channels, Mat(), hist_srctest1, 2, histSize, ranges, true, false);
	normalize(hist_srctest1, hist_srctest1, 0, 1, NORM_MINMAX, -1, Mat());

	calcHist(&srctest2, 1, channels, Mat(), hist_srctest2, 2, histSize, ranges, true, false);
	normalize(hist_srctest2, hist_srctest2, 0, 1, NORM_MINMAX, -1, Mat());
	 
	// 直方图比较   使用不同方法直接修改
	//相关性HISTCMP_CORREL   卡方HISTCMP_CHISQR  十字交叉性HISTCMP_INTERSECT 巴氏距离HISTCMP_BHATTACHARYYA
	double src_src = compareHist(hist_src, hist_src, HISTCMP_CHISQR);
	double src_srctest1 = compareHist(hist_src, hist_srctest1, HISTCMP_CHISQR);
	double src_srctest2 = compareHist(hist_src, hist_srctest2, HISTCMP_CHISQR);
	double srctest1_srctest2 = compareHist(hist_srctest1, hist_srctest2, HISTCMP_CHISQR);

	cout << "src compare with src correlation value: " << src_src << endl;
	cout << "src compare with srctest1 correlation value: " << src_srctest1 << endl;
	cout << "src compare with srctest2 correlation value: " << src_srctest2 << endl;
	cout << "srctest1 compare with srctest2 correlation value: " << srctest1_srctest2 << endl;

	// 在图像上添加比较结果的文本
	putText(src, convertToString(src_src), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 255, 255), 2, LINE_AA);
	putText(srctest1, convertToString(src_srctest1), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
	putText(srctest2, convertToString(src_srctest2), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(255, 0, 255), 2, LINE_AA);

	// 显示结果图像
	namedWindow(INPUT_TITLE0, WINDOW_AUTOSIZE);
	namedWindow(INPUT_TITLE1, WINDOW_AUTOSIZE);
	namedWindow(INPUT_TITLE2, WINDOW_AUTOSIZE);

	imshow(INPUT_TITLE0, src);
	imshow(INPUT_TITLE1, srctest1);
	imshow(INPUT_TITLE2, srctest2);

	waitKey(0);
}
// 转换 double 类型为字符串
string convertToString(double d) {
	ostringstream os;
	if (os << d) {
		return os.str();
	}
	return "invalid conversion";
}

相关性 (Correlation)——HISTCMP_CORREL结果:
使用相关性 (Correlation) 作为度量标准来比较三张图像的直方图,src 和 srctest1 的相关性为 0.999054,接近 1,表示它们的直方图非常相似,这两张图像的内容几乎一致;而 src 和 srctest2 的相关性为 -0.00756844,接近 0,甚至是负值,表明这两张图像的直方图几乎没有相关性;同时 srctest1 和 srctest2 的相关性为 -0.00750053,这两者之间的图像差异非常显著, src 和 srctest1 是非常相似的图像, srctest2 与其他两张图像的差异较大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方 (Chi-Square)——HISTCMP_CHISQR结果:

使用卡方(Chi-Square)作为比较方法时,结果显示 src 与 srctest1 的卡方值为 0.664607,它们的直方图之间存在一些差异,但差异较小;而 src 与 srctest2 的卡方值 13425.5,这两张图像的直方图有极大的差异,图像内容显著不同。同样,srctest1 和 srctest2 之间的卡方值为 15850.8,说明 srctest1 和 srctest2 之间的内容差异也非常明显。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.完整代码

#include<opencv2/opencv.hpp>
#include<highgui.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
using namespace std;

void histogram_equalization()
{
	// 读取输入图像
	Mat src = imread("lena.png", IMREAD_COLOR);
	if (src.empty()) {
		cout << "Could not open or find the image!" << endl;
		return;
	}

	// 显示原始图像
	namedWindow("Original Image", WINDOW_AUTOSIZE);
	imshow("Original Image", src);

	// 将图像转换为灰度图
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	// 进行直方图均衡化
	Mat equalizedImage;
	equalizeHist(gray, equalizedImage);

	// 显示均衡化后的图像
	namedWindow("Equalized Image", WINDOW_AUTOSIZE);
	imshow("Equalized Image", equalizedImage);

	/*********************直方图计算和显示*******************************/
	// 分离图像的BGR通道
	vector<Mat> bgr_planes;
	split(src, bgr_planes);

	// 定义直方图的参数
	int histSize = 256;
	float range[] = { 0, 256 };  // 灰度值范围
	const float* histRange = { range };

	Mat b_hist, g_hist, r_hist;

	// 分别计算三个通道的直方图
	calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange);
	calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange);
	calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange);

	// 归一化直方图,使得图像高度为 400 像素
	int histImageHeight = 400;
	int histImageWidth = 512;
	normalize(b_hist, b_hist, 0, histImageHeight, NORM_MINMAX);
	normalize(g_hist, g_hist, 0, histImageHeight, NORM_MINMAX);
	normalize(r_hist, r_hist, 0, histImageHeight, NORM_MINMAX);

	// 创建显示直方图的图像,大小为 512x400,背景为黑色
	Mat histImage(histImageHeight, histImageWidth, CV_8UC3, Scalar(0, 0, 0));

	// 在同一张图像上绘制蓝、绿、红三个通道的直方图
	for (int i = 1; i < histSize; i++) {
		line(histImage,
			Point((i - 1) * histImageWidth / histSize, histImageHeight - cvRound(b_hist.at<float>(i - 1))),
			Point(i * histImageWidth / histSize, histImageHeight - cvRound(b_hist.at<float>(i))),
			Scalar(255, 0, 0), 2); // 蓝色

		line(histImage,
			Point((i - 1) * histImageWidth / histSize, histImageHeight - cvRound(g_hist.at<float>(i - 1))),
			Point(i * histImageWidth / histSize, histImageHeight - cvRound(g_hist.at<float>(i))),
			Scalar(0, 255, 0), 2); // 绿色

		line(histImage,
			Point((i - 1) * histImageWidth / histSize, histImageHeight - cvRound(r_hist.at<float>(i - 1))),
			Point(i * histImageWidth / histSize, histImageHeight - cvRound(r_hist.at<float>(i))),
			Scalar(0, 0, 255), 2); // 红色
	}

	// 显示合并的直方图
	imshow("Combined BGR Histogram", histImage);
	waitKey(0);
}
#define INPUT_TITLE0 "input image src"
#define INPUT_TITLE1 "input image srctest1"
#define INPUT_TITLE2 "input image srctest2"

string convertToString(double d);
void Histogram_comparison()
{
	// 加载图像
	Mat src, srctest1, srctest2;
	src = imread("sherlock.jpg");
	srctest1 = imread("sherlock2.jpg");
	srctest2 = imread("lena.png");

	if (!src.data || !srctest1.data || !srctest2.data) {
		cout << "ERROR: Could not load image." << endl;
		return;
	}

	imshow("【src 原图】", src);
	imshow("【srctest1 原图】", srctest1);
	imshow("【srctest2 原图】", srctest2);

	// 从RGB色彩空间转换为HSV色彩空间
	cvtColor(src, src, COLOR_BGR2HSV);
	cvtColor(srctest1, srctest1, COLOR_BGR2HSV);
	cvtColor(srctest2, srctest2, COLOR_BGR2HSV);

	// 定义直方图计算所需的参数,主要是 H 和 S 两个通道
	int h_bins = 50;  // H 通道的直方图 bin 数
	int s_bins = 60;  // S 通道的直方图 bin 数
	int histSize[] = { h_bins, s_bins };

	// H 和 S 通道的取值范围
	float h_ranges[] = { 0, 180 };
	float s_ranges[] = { 0, 256 };
	const float* ranges[] = { h_ranges, s_ranges };

	// 使用 H 和 S 通道
	int channels[] = { 0, 1 };

	// MatND 是 Mat 的别名,区分经过直方图计算处理后的数据和原始图像
	MatND hist_src, hist_srctest1, hist_srctest2;

	// 计算直方图并进行归一化
	calcHist(&src, 1, channels, Mat(), hist_src, 2, histSize, ranges, true, false);
	normalize(hist_src, hist_src, 0, 1, NORM_MINMAX, -1, Mat());

	calcHist(&srctest1, 1, channels, Mat(), hist_srctest1, 2, histSize, ranges, true, false);
	normalize(hist_srctest1, hist_srctest1, 0, 1, NORM_MINMAX, -1, Mat());

	calcHist(&srctest2, 1, channels, Mat(), hist_srctest2, 2, histSize, ranges, true, false);
	normalize(hist_srctest2, hist_srctest2, 0, 1, NORM_MINMAX, -1, Mat());
	 
	// 直方图比较   使用不同方法直接修改
	//相关性HISTCMP_CORREL   卡方HISTCMP_CHISQR  十字交叉性HISTCMP_INTERSECT 巴氏距离HISTCMP_BHATTACHARYYA
	double src_src = compareHist(hist_src, hist_src, HISTCMP_CHISQR);
	double src_srctest1 = compareHist(hist_src, hist_srctest1, HISTCMP_CHISQR);
	double src_srctest2 = compareHist(hist_src, hist_srctest2, HISTCMP_CHISQR);
	double srctest1_srctest2 = compareHist(hist_srctest1, hist_srctest2, HISTCMP_CHISQR);

	cout << "src compare with src correlation value: " << src_src << endl;
	cout << "src compare with srctest1 correlation value: " << src_srctest1 << endl;
	cout << "src compare with srctest2 correlation value: " << src_srctest2 << endl;
	cout << "srctest1 compare with srctest2 correlation value: " << srctest1_srctest2 << endl;

	// 在图像上添加比较结果的文本
	putText(src, convertToString(src_src), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 255, 255), 2, LINE_AA);
	putText(srctest1, convertToString(src_srctest1), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
	putText(srctest2, convertToString(src_srctest2), Point(50, 50), FONT_HERSHEY_COMPLEX, 1, Scalar(255, 0, 255), 2, LINE_AA);

	// 显示结果图像
	namedWindow(INPUT_TITLE0, WINDOW_AUTOSIZE);
	namedWindow(INPUT_TITLE1, WINDOW_AUTOSIZE);
	namedWindow(INPUT_TITLE2, WINDOW_AUTOSIZE);

	imshow(INPUT_TITLE0, src);
	imshow(INPUT_TITLE1, srctest1);
	imshow(INPUT_TITLE2, srctest2);

	waitKey(0);
}
// 转换 double 类型为字符串
string convertToString(double d) {
	ostringstream os;
	if (os << d) {
		return os.str();
	}
	return "invalid conversion";
}
int main() 
{
	
	histogram_equalization();
	Histogram_comparison();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

缓存的思考与总结

缓存的思考与总结 什么是缓存缓存命中率数据一致性旁路模式 Cache aside双写模式直写模式 write through异步写 Write Behind 旁路和双写 案例 新技术或中间的引入&#xff0c;一定是解决了亟待解决的问题或是显著提升了系统性能&#xff0c;并且这种改变所带来的增幅&#xff…

Mysql删库跑路,如何恢复数据?

问题 删库跑路&#xff0c;数据还能恢复吗&#xff1f; 我们经常听说某某被领导训斥了&#xff0c;对领导心生痛恨&#xff0c;然后登录 Mysql 删库跑路。对于闲聊中经常听说过的一个段子&#xff0c;在现实生活中是否真的发生过&#xff0c;如果发生了&#xff0c;我们该如何解…

基于单片机的智能小车的开发与设计

摘要&#xff1a;本文论述了基于 STC89C52 单片机的智能小车的开发与设计过程。该设计采用单片机、电机驱动及光电循迹等技术&#xff0c;保证小车在无人管理状态下&#xff0c;能按照预先设定的线路实现自动循迹功能。在电路结构设计中力求方便&#xff0c;可操作&#xff0c;…

go webapi上传文件

一、导入依赖 import "net/http" 我这里用到了Guid所以安装依赖 go get github.com/google/uuid 二、main.go package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""path/filepath&q…

七彩云南文化旅游网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列 问题发现问题解决方法一&#xff1a;只监听死信队列&#xff0c;在死信队列里面处理业务逻辑方法二&#xff1a;修改预取值 问题发现 最近再学习RabbitMQ过程中&#xff0c;看到关于死信队列内容&#xff1a; 来自队…

计算机组成原理——存储系统

计算机组成原理——存储系统 存储器层次结构 存储器层次结构如下&#xff1a; 寄存器&#xff08;CPU&#xff09;Cache&#xff08;高速缓冲存储器&#xff09;主存磁盘磁带、光盘等 按照上述层次结构&#xff0c;自下而上速度依次增快、容量相对依次渐小、造价越来越高昂…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【文件系统】上

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

锂电池基础知识

1. 电池的发展史 电池是将化学能转变为电能的装置&#xff0c;通过电池内部的化学反应向外部提供直流电能 1800年Vote伏打电堆 1835年英国Daniel丹尼尔电池 1859年法国Plante铅酸蓄电池 1866年法国Leclanche锌锰电池 1899年瑞典Jungner镍镉电池 1950年Urry碱性电池 1990年索尼…

鸿蒙OpenHarmony【轻量系统内核扩展组件(C++支持)】子系统开发

C支持 基本概念 C作为目前使用最广泛的编程语言之一&#xff0c;支持类、封装、重载等特性&#xff0c;是在C语言基础上开发的一种面向对象的编程语言。 运行机制 C代码的识别主要由编译器支持&#xff0c;系统主要对全局对象进行构造函数调用&#xff0c;进行初始化操作。…

【漏洞复现】用友 NC-Cloud queryStaffByName Sql注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

智能农业系统——作物生长模型

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、AI知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&#x…

windows 驱动实例分析系列-COM驱动案例讲解

COM也被称之为串口,这是一种非常简单的通讯接口,这种结构简单的接口被广泛的应用在开发中,几乎所有系统都能支持这种通讯接口,它有RS232和RS485等分支,但一般我们都会使用RS232作为常见的串口,因为它足够简单和高效。 几乎所有的开发板,都会提供用于烧录、调试、日志的…

《Pyramid Vision Transformer》论文笔记

原文笔记 What 为了解决VIT在视觉任务上的局限性并且探究Transformer模型在视觉任务上的应用&#xff0c;这项工作提出了一种纯 Transformer 主干&#xff0c;称为 Pyramid Vision Transformer (PVT)&#xff0c;它可以作为 CNN 主干在许多下游任务中的替代方案&#xff0c;包…

【人工智能】Linux系统Mamba安装流程

在编译安装 mamba 之前&#xff0c;你需要确保已安装正常的PyTorch环境。 # 安装必要的系统依赖 sudo apt update sudo apt install build-essential # 安装mamba依赖 pip install packaging wheel # 克隆仓库 git clone https://github.com/Dao-AILab/causal-conv1d.git git …

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目&#xff1a; 大数据驱动的…

fastadmin 根据选择数据来传参给selectpage输入框

文章目录 js代码php代码&#xff1a;完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…

torch.embedding 报错 IndexError: index out of range in self

文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错&#xff1a; IndexError: index out of range in self2. 原因 首先看下正常情况&#xff1a; import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…

【C++ Primer Plus习题】17.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…

PHP、Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发&#xff0c;它的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金&#xff0c;这使得GoFly快速框架得到良好的发展&#xff0c;GoFly技术团队加大投入反哺科技企业和开…