矩阵论在图像算法中的应用

摘要: 本文详细阐述了矩阵论在图像算法中的广泛应用。首先介绍了图像在计算机中的矩阵表示形式,然后从图像压缩、图像变换、图像特征提取与识别、图像恢复与重建等多个方面深入分析了矩阵论相关技术的作用原理和优势。通过对这些应用的探讨,展示了矩阵论在提高图像处理效率、增强图像质量和实现复杂图像分析任务中的关键地位,同时对其未来发展方向进行了展望。

一、引言

图像作为一种重要的信息载体,在众多领域如计算机视觉、医学成像、遥感、安防等有着广泛的应用。随着数字化技术的发展,对图像的处理和分析要求也日益提高。矩阵论作为数学的一个重要分支,为图像算法提供了坚实的理论基础和有效的计算工具。通过将图像表示为矩阵形式,利用矩阵的各种运算和性质,可以实现图像的高效处理和深入分析。

二、图像的矩阵表示

在计算机中,一幅二维灰度图像可以用一个矩阵来表示。对于一个  $M\times N$的图像,其灰度值可以存储在一个$M\times N$  的矩阵$A$  中,其中矩阵中的每个元素$a_{ij}$  表示图像在第 i 行第 j 列位置的灰度值。彩色图像通常可以用多个矩阵来表示,例如对于 RGB 彩色模式,一幅图像可以由红、绿、蓝三个颜色通道的矩阵组成。这种矩阵表示形式使得我们可以方便地利用矩阵运算来处理图像。

三、矩阵论在图像压缩中的应用

(一)奇异值分解(SVD)

奇异值分解是矩阵论中的一种重要分解方法。对于一个$M\times N$  的矩阵$A$,可以分解为 $A = U\Sigma V^T$,其中U是一个$m\times m$  的正交矩阵,$\Sigma$ 是一个  $m\times n$的对角矩阵,其对角元素为奇异值,V 是一个 $n\times n$ 的正交矩阵。

在图像压缩中,将图像矩阵进行 SVD 分解。由于奇异值的大小反映了矩阵所包含信息的重要程度,我们可以选择保留较大的奇异值,而舍弃较小的奇异值。通过重构矩阵 (其中  是保留了部分奇异值的对角矩阵),可以得到压缩后的图像。这种方法可以在损失一定图像质量的情况下,大大减少图像数据的存储量。

(二)小波变换与矩阵表示

小波变换是另一种常用的图像压缩方法。小波变换可以通过离散小波变换(DWT)矩阵来实现。DWT 矩阵将图像矩阵分解为不同尺度和方向的小波系数矩阵。这些系数矩阵具有不同的能量分布,低频部分的系数包含了图像的主要信息,而高频部分则包含了图像的细节信息。通过对小波系数进行阈值量化,将较小的系数置零,可以实现图像的压缩。同时,小波变换的多分辨率特性使得它可以根据需要选择合适的分辨率来压缩图像,进一步提高压缩效率。

四、矩阵论在图像变换中的应用

(一)傅里叶变换

傅里叶变换是一种将图像从空间域转换到频率域的重要变换方法。对于一个离散图像矩阵 ,其二维离散傅里叶变换(DFT)定义为:

F(u,v)=\frac{1}{MN}\sum_{x = 0}^{M - 1}\sum_{y = 0}^{N - 1}f(x,y)e^{-j2\pi(\frac{ux}{M}+\frac{vy}{N})}

(二)离散余弦变换(DCT)

离散余弦变换在图像压缩和变换中也有着广泛的应用。对于一个  的图像矩阵 ,其二维离散余弦变换公式为:


F(u,v)=\alpha(u)\alpha(v)\sum_{x = 0}^{N - 1}\sum_{y = 0}^{N - 1}f(x,y)\cos\frac{\pi(2x + 1)u}{2N}\cos\frac{\pi(2y + 1)v}{2N}

DCT 将图像的能量集中在少数几个系数上,在图像压缩标准如 JPEG 中,通过对 DCT 系数进行量化和编码来实现图像压缩。同时,DCT 也可用于图像的特征提取和纹理分析,通过分析 DCT 系数的分布来获取图像的相关特征。

五、矩阵论在图像特征提取与识别中的应用

(一)主成分分析(PCA)

主成分分析是基于矩阵协方差分析的一种数据降维和特征提取方法。对于一组图像数据,可以将每个图像表示为一个向量,然后将这些向量组成一个矩阵。通过计算该矩阵的协方差矩阵,并对协方差矩阵进行特征值分解,得到主成分。这些主成分是原始图像数据的线性组合,它们按照所包含信息量的多少进行排序。

在图像识别中,通过将图像投影到主成分空间,可以减少图像数据的维度,同时保留对分类最有用的信息。新的低维特征向量可以作为图像的特征表示用于分类器的训练和识别,提高了识别效率和准确性。

(二)特征值与特征向量在图像纹理分析中的应用

图像的纹理是图像的重要特征之一。矩阵的特征值和特征向量可以用于分析图像的纹理特征。例如,对于图像的局部区域,可以构建一个灰度共生矩阵,通过计算该矩阵的特征值和特征向量来描述纹理的方向、粗糙度等特性。不同的纹理具有不同的特征值和特征向量分布,这些特征可以用于图像的分类和识别,区分具有不同纹理的图像区域。

六、矩阵论在图像恢复与重建中的应用

(一)最小二乘法在图像去噪中的应用

在图像采集和传输过程中,往往会受到噪声的干扰。假设受到噪声污染的图像  可以表示为原始图像 x 和噪声n  的和,即 y=x+n。

如果我们有一个关于原始图像的线性模型 $Ax = b$(其中A  是一个已知的系数矩阵,可能与图像的采集过程或先验知识有关),可以通过最小二乘法求解X ,使得$\|Ax - y\|^2$  最小。在图像去噪中,这个过程可以利用矩阵运算来迭代地优化图像,去除噪声,恢复原始图像的信息。

(二)压缩感知与矩阵重构

压缩感知理论指出,对于一个稀疏信号或可压缩信号,可以通过少量的线性测量来恢复原始信号。在图像中,如果图像在某个变换域是稀疏的(如小波域),可以通过设计合适的测量矩阵对图像进行测量,得到少量的测量值。然后通过求解一个优化问题,利用矩阵重构算法(如基于凸优化的方法或贪婪算法)来恢复原始图像。这种方法在减少图像采集数据量的同时,仍能保证图像的高质量恢复,在医学成像等领域有着重要的应用。

七、结论与展望

矩阵论在图像算法中有着至关重要的应用。从图像的表示、压缩、变换、特征提取到恢复重建等各个环节,矩阵的运算和相关理论为图像算法提供了高效的实现途径和准确的分析方法。随着图像技术的不断发展,如高分辨率图像、动态图像序列的处理需求增加,以及对图像理解和语义分析的深入要求,矩阵论将继续在新的图像算法开发中发挥关键作用。未来,我们可以期待更高效的矩阵分解算法、更适应复杂图像结构的变换方法以及更精确的基于矩阵的图像模型的出现,进一步推动图像技术在各个领域的广泛应用和创新发展。同时,矩阵论与其他数学分支如优化理论、概率论等的结合也将为图像算法带来新的突破。

八、代码示例

以下是上述矩阵论在图像算法各应用场景对应的 C++ OpenCV 代码示例:

一、图像的矩阵表示(OpenCV 中图像本身就是以矩阵形式存储,这里简单展示读取并访问图像矩阵元素的示例)

#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_COLOR);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 获取图像的行数和列数int rows = image.rows;int cols = image.cols;// 访问图像矩阵元素(这里以访问每个像素的蓝色通道为例)for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {// 获取像素点的引用cv::Vec3b& pixel = image.at<cv::Vec3b>(i, j);// 访问蓝色通道值uchar blueValue = pixel[0];// 可以在这里对蓝色通道值进行操作,比如修改它// pixel[0] = 255; // 将蓝色通道值设为255(这里只是示例,可根据需求修改)}}// 显示处理后的图像(这里只是示例,可根据需求添加更多显示设置等)cv::namedWindow("Processed Image", cv::WINDOW_NORMAL);cv::imshow("Processed Image", image);cv::waitKey(0);return 0;
}

二、矩阵论在图像压缩中的应用

奇异值分解(SVD)用于图像压缩

#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 对图像进行奇异值分解cv::SVD svd(image);// 获取奇异值矩阵cv::Mat singularValues = svd.w;// 选择保留的奇异值数量(这里假设保留前k个奇异值)int k = 50;// 创建新的奇异值矩阵,只保留前k个奇异值,其余设为0cv::Mat singularValuesReduced = cv::Mat::zeros(singularValues.rows, singularValues.cols, singularValues.type());for (int i = 0; i < k; ++i) {singularValuesReduced.at<double>(i, i) = singularValues.at<double>(i, i);}// 重构图像cv::Mat reconstructedImage = svd.u * singularValuesReduced * svd.vt;// 显示原始图像和压缩后重构的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Compressed and Reconstructed Image", cv::WINDOW_NORMAL);cv::imshow("Compressed and Reconstructed Image", reconstructedImage);cv::waitKey(0);return 0;
}
小波变换与矩阵表示用于图像压缩

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 进行小波变换cv::Mat waveletTransformed;cv::dwt(image, waveletTransformed);// 获取小波系数矩阵(这里简单示例,实际可能需要更深入处理不同子带系数)cv::Mat LL, LH, HL, HH;cv::split(waveletTransformed, {LL, LH, HL, HH});// 对小波系数进行阈值量化(这里简单设置一个阈值,将小于阈值的系数设为0)double threshold = 10.0;for (int i = 0; i < LL.rows; ++i) {for (int j = 0; j < LL.cols; ++j) {if (std::abs(LL.at<double>(i, j)) < threshold) {LL.at<double>(i, j) = 0;}}}for (int i = 0; i < LH.rows; ++i) {for (int j = 0; j < LH.cols; ++j) {if (std::abs(LH.at<double>(i, j)) < threshold) {LH.at<double>(i, j) = 0;}}}for (int i = 0; i < HL.rows; ++i) {for (int j = 0; j < HL.cols; ++j) {if (std::abs(HL.at<double>(i, j)) < threshold) {HL.at<double>(i, j) = 0;}}}for (int i = 0; i < HH.rows; ++i) {for (int j = 0; j < HH.cols; ++j) {if (std::abs(HH.at<double>(i, j)) < threshold) {HH.at<double>(i, j) = 0;}}}// 重构图像cv::Mat reconstructedImage;cv::idwt(LL, LH, HL, HH, reconstructedImage);// 显示原始图像和压缩后重构的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Compressed and Reconstructed Image", cv::WINDOW_NORMAL);cv::imshow("Compressed and Reconstructed Image", reconstructedImage);cv::waitKey(0);return 0;
}

三、矩阵论在图像变换中的应用

傅里叶变换用于图像滤波

#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 进行二维离散傅里叶变换cv::Mat dftImage;cv::dft(image, dftImage, cv::DFT_COMPLEX_OUTPUT);// 将零频率分量移到中心cv::shift(dftImage, dftImage);// 创建滤波器(这里简单创建一个低通滤波器示例)int rows = dftImage.rows;int cols = dftImage.cols;cv::Mat filter = cv::Mat::zeros(rows, cols, CV_32FC2);int centerX = rows / 2;int centerY = cols / 2;int radius = 30;for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {int dx = i - centerX;int dy = j - centerY;if (sqrt(dx * dx + dy * dy) <= radius) {filter.at<cv::Vec2f>(i, j)[0] = 1;filter.at<cv::Vec2f>(i, j)[1] = 1;}}}// 应用滤波器cv::Mat filteredDftImage;cv::mulSpectrums(dftImage, filter, filteredDftImage, 0);// 将零频率分量移回原来位置cv::shift(filteredDftImage, filteredDftImage);// 进行逆傅里叶变换cv::Mat filteredImage;cv::idft(filteredDftImage, filteredImage, cv::DFT_REAL_OUTPUT);// 显示原始图像和滤波后的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Filtered Image", cv::WINDOW_NORMAL);cv::imshow("Filtered Image", filteredImage);cv::waitKey(0);return 0;
}
离散余弦变换(DCT)用于图像压缩

#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 进行二维离散余弦变换cv::Mat dctImage;cv::dct(image, dctImage);// 对DCT系数进行量化(这里简单示例,实际量化方式更复杂)for (int i = 0; i < dctImage.rows; ++i) {for (int j = 0; j < dctImage.cols; ++j) {dctImage.at<double>(i, j) = round(dctImage.at<double>(i, j) / 10);}}// 进行逆离散余弦变换cv::Mat reconstructedImage;cv::idct(dctImage, reconstructedImage);// 显示原始图像和压缩后重构的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Compressed and Reconstructed Image", cv::WINDOW_NORMAL);cv::imshow("Compressed and Reconstructed Image", reconstructedImage);cv::waitKey(0);return 0;
}

四、矩阵论在图像特征提取与识别中的应用

主成分分析(PCA)用于图像识别

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/ml/ml.hpp>// 假设我们有一组图像数据,这里简单模拟一下,实际应该从文件或数据库读取
std::vector<cv::Mat> loadImageData() {std::vector<cv::Mat> imageData;// 这里可以添加代码从文件或其他来源加载真实的图像数据,并将每个图像转换为向量形式,这里简单模拟几个示例向量cv::Mat image1 = cv::Mat::ones(100, 100, CV_32FC1);cv::Mat image2 = cv::Mat::zeros(100, 100, CV_32FC1);imageData.push_back(image1.reshape(1, 100 * 100));imageData.push_back(image2.reshape(1, 100 * 100));return imageData;
}int main() {// 加载图像数据std::vector<cv::Mat> imageData = loadImageData();// 将图像数据组成矩阵cv::Mat dataMatrix;for (const auto& image : imageData) {if (dataMatrix.empty()) {dataMatrix = image;} else {dataMatrix.push_back(image);}}// 进行主成分分析cv::PCA pca(dataMatrix, cv::Mat(), cv::PCA::DATA_AS_ROW, 2);// 获取主成分cv::Mat eigenvectors = pca.eigenvectors;cv::Mat eigenvalues = pca.eigenvalues;// 将图像投影到主成分空间cv::Mat projectedData;pca.project(dataMatrix, projectedData);// 这里可以进一步使用投影后的数据进行分类器训练等操作,这里简单展示获取到的投影数据std::cout << "投影后的数据:" << std::endl;std::cout << projectedData << std::endl;return 0;
}
特征值与特征向量在图像纹理分析中的应用

#include <iostream>
#include <opencv2/opencv.hpp>// 计算灰度共生矩阵
cv::Mat calculateGrayLevelCooccurrenceMatrix(const cv::Mat& image, int distance, int angle) {int rows = image.rows;int cols = image.cols;cv::Mat glcm = cv::Mat::zeros(256, 256, CV_32FC1);for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {uchar currentPixel = image.at<uchar>(i, j);int newI = i + (int)(distance * cos(angle));int newJ = j + (int)(distance * sin(angle));if (newI >= 0 && newI < rows && newJ >= 0 && newJ < cols) {uchar neighborPixel = image.at<uchar>(newI, newJ);glcm.at<float>(currentPixel, neighborPixel)++;}}}return glcm;
}int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 计算灰度共生矩阵(这里假设距离为1,角度为0度)cv::Mat glcm = calculateGrayLevelCooccurrenceMatrix(image, 1, 0);// 计算灰度共生矩阵的特征值和特征向量cv::SVD svd(glcm);cv::Mat eigenvalues = svd.w;cv::Mat eigenvectors = svd.u;// 这里可以根据特征值和特征向量分析图像纹理特征,比如纹理的方向、粗糙度等,这里简单展示获取到的特征值和特征向量std::cout << "特征值:" << std::endl;std::cout << eigenvalues << std::endl;std::cout << "特征向量:" << std::endl;std::cout << eigenvectors << std::endl;return 0;
}

五、矩阵论在图像恢复与重建中的应用

最小二乘法在图像去噪中的应用
#include <iostream>
#include <opencv2/opencv.hpp>// 假设我们有一个简单的线性模型,这里模拟一下,实际可能与图像采集设备等相关
cv::Mat createCoefficientMatrix(int rows, int cols) {cv::Mat A = cv::Mat::ones(rows, cols, CV_32FC1);return A;
}int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 模拟添加噪声cv::Mat noisyImage = image.clone();cv::randn(noisyImage, 0, 20); // 添加均值为0,标准差为20的高斯噪声// 创建系数矩阵(这里简单模拟)cv::Mat A = createCoefficientMatrix(image.rows, image.cols);// 利用最小二乘法求解去噪后的图像cv::Mat x;cv::solve(A, noisyImage, x, cv::DECOMP_NORMAL);// 显示原始图像、噪声图像和去噪后的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);cv::imshow("Noisy Image", noisyImage);cv::namedWindow("Denoised Image", cv::WINDOW_NORMAL);cv::imshow("Denoised Image", x);cv::waitKey(0);return 0;
}

奇异值分解(SVD)用于图像压缩

#include <iostream>
#include <opencv2/opencv.hpp>// 计算压缩比
double calculateCompressionRatio(const cv::Mat& originalImage, const cv::Mat& compressedImage) {double originalSize = originalImage.total() * originalImage.elemSize();double compressedSize = compressedImage.total() * compressedImage.elemSize();return originalSize / compressedSize;
}int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 对图像进行奇异值分解cv::SVD svd(image);// 获取奇异值矩阵cv::Mat singularValues = svd.w;// 选择保留的奇异值数量(这里通过设置压缩比例来确定保留的奇异值数量)double compressionRatio = 0.1; // 设置压缩比例为10%,可根据需求调整int k = static_cast<int>(singularValues.rows * compressionRatio);// 创建新的奇异值矩阵,只保留前k个奇异值,其余设为0cv::Mat singularValuesReduced = cv::Mat::zeros(singularValues.rows, singularValues.cols, singularValues.type());for (int i = 0; i < k; ++i) {singularValuesReduced.at<double>(i, i) = singularValues.at<double>(i, i);}// 重构图像cv::Mat reconstructedImage = svd.u * singularValuesReduced * svd.vt;// 计算压缩比double ratio = calculateCompressionRatio(image, reconstructedImage);// 显示原始图像和压缩后重构的图像,并输出压缩比cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Compressed and Reconstructed Image", cv::WINDOW_NORMAL);cv::imshow("Compressed and Reconstructed Image", reconstructedImage);std::cout << "压缩比: " << ratio << std::endl;cv::waitKey(0);return 0;
}

在上述代码中:

  • calculateCompressionRatio 函数用于计算图像压缩前后的压缩比,通过比较原始图像和压缩后重构图像的数据量来得出。
  • 在 main 函数中,首先读取灰度图像,然后进行奇异值分解。通过设置期望的压缩比例来确定要保留的奇异值数量 k,接着重构图像并计算压缩比,最后显示原始图像和压缩后重构的图像以及输出压缩比信息。

小波变换与矩阵表示用于图像压缩

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>// 对小波系数进行阈值量化处理
void thresholdWaveletCoefficients(cv::Mat& waveletCoefficients, double threshold) {for (int i = 0; i < waveletCoefficients.rows; ++i) {for (int j = 0; j < waveletCoefficients.cols; ++j) {if (std::abs(waveletCoefficients.at<double>(i, j)) < threshold) {waveletCoefficients.at<double>(i, j) = 0;}}}
}// 计算压缩比
double calculateCompressionRatio(const cv::Mat& originalImage, const cv::Mat& compressedImage) {double originalSize = originalImage.total() * originalImage.elemSize();double compressedSize = compressedImage.total() * compressedImage.elemSize();return originalSize / compressedSize;
}int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cout << "无法读取图像!" << std::endl;return -1;}// 进行小波变换cv::Mat waveletTransformed;cv::dwt(image, waveletTransformed);// 获取小波系数矩阵(这里简单示例,实际可能需要更深入处理不同子带系数)cv::Mat LL, LH, HL, HH;cv::split(waveletTransformed, {LL, LH, HL, HH});// 设置阈值进行小波系数的阈值量化(可根据需求调整阈值)double threshold = 10.0;thresholdWaveletCoefficients(LL, threshold);thresholdWaveletCoefficients(LH, threshold);thresholdWaveletCoefficients(HL, threshold);thresholdWaveletCoefficients(HH, threshold);// 重构图像cv::Mat reconstructedImage;cv::idwt(LL, LH, HL, HH, reconstructedImage);// 计算压缩比double ratio = calculateCompressionRatio(image, reconstructedImage);// 显示原始图像和压缩后重构的图像,并输出压缩比cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", image);cv::namedWindow("Compressed and Reconstructed Image", cv::WINDOW_NORMAL);cv::imshow("Compressed and Reconstructed Image", reconstructedImage);std::cout << "压缩比: " << ratio << std::endl;cv::waitKey(0);return 0;
}

以上代码均可直接使用,如有BUG,需要微调,搞不定的可私信我。 

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

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

相关文章

鸿蒙改变状态栏和安全区域颜色之 expandSafeArea

改变状态栏和安全区域颜色之 expandSafeArea 基于API12。 参考文档 直接设置build里边根元素的背景色之后&#xff0c;本想着是整个页面的颜色全变成相应的颜色&#xff0c;不过实际上状态栏跟地步安全区域是不受影响的。这个时候一般可能都会各种地方找API来设置状态栏跟安全…

Ubuntu Linux使用前准备动作_使用root登录图形化界面

Ubuntu默认是不允许使用 root 登录图形化界面的。这是出于安全考虑的设置。但如果有需要&#xff0c;可以通过以下步骤来实现使用 root 登录&#xff1a; 1、设置 root 密码 打开终端&#xff0c;使用当前的管理员账户登录系统。在终端中输入命令sudo passwd root&#xff0c…

交换排序——快速排序3 针对LeetCode某OJ的优化

交换排序——快速排序3 针对LeetCode某OJ的优化 快速排序的优化小区间优化三数取中三路划分优化 快速排序的优化 这篇优化围绕这个测试OJ展开。 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 这个测试OJ在早期用快排还能过。但现在用快排不能过了。 因为这个OJ针…

【Vue笔记】基于vue3 + element-plus + el-dialog封装一个自定义的dialog弹出窗口组件

这篇文章,介绍一下如何使用vue3+element-plus中的el-dialog组件,自己封装一个通用的弹出窗口组件。运行效果如下所示: 目录 1.1、父子组件通信 1.2、自定义VDialog组件(【v-model】模式) 1.2.1、编写VDialog组件代码 1.2.2、使用VDialog组件 1.2.3、运行效果 1.3、自…

【支持向量机(SVM)】:算法原理及核函数

文章目录 1 SVM算法原理1.1 目标函数确定1.2 约束条件优化问题转换1.3 对偶问题转换1.4 确定超平面1.5 计算举例1.6 SVM原理小节 2 SVM核函数2.1 核函数的作用2.2 核函数分类2.3 高斯核函数2.3 高斯核函数API2.4 超参数 γ \gamma γ 1 SVM算法原理 1.1 目标函数确定 SVM思想…

【数据结构】树——链式存储二叉树的基础

写在前面 书接上文&#xff1a;【数据结构】树——顺序存储二叉树 本篇笔记主要讲解链式存储二叉树的主要思想、如何访问每个结点、结点之间的关联、如何递归查找每个结点&#xff0c;为后续更高级的树形结构打下基础。不了解树的小伙伴可以查看上文 文章目录 写在前面 一、链…

Java基于微信小程序+SSM的校园失物招领小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

IDEA 2024.3 版本更新主要功能介绍

IDEA 2024.3 版本提供的新特性 IntelliJ IDEA 2024.3 的主要新特性&#xff1a; AI Assistant 增强 改进的代码补全和建议更智能的代码分析和重构建议Java 支持改进 支持 Java 21 的所有新特性改进的模式匹配和记录模式支持更好的虚拟线程调试体验开发工具改进 更新的 UI/UX 设…

Unity类银河战士恶魔城学习总结(P132 Merge skill tree with skill Manager 把技能树和冲刺技能相组合)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了解锁技能后才可以使用技能&#xff0c;先完成了冲刺技能的锁定解锁 Dash_Skill.cs using System.Collections; using System…

linux 中mysql查看慢日志

1、到mysql容器&#xff0c;先登录到数据库&#xff0c;查看是否开启 mysql -h 127.0.0.1 -uroot -p SHOW VARIABLES LIKE slow_query_log; 2、如果没有开启&#xff0c;需要先开启 set global slow_query_log ON; 3、查看慢日志文件 SHOW VARIABLES LIKE slow_query_log…

奶龙IP联名异军突起:如何携手品牌营销共创双赢?

在快节奏的互联网消费时代&#xff0c;年轻消费群体对产品和品牌的要求越来越挑剔。因此在品牌年轻化的当下&#xff0c;一方面需要品牌自身形象也要不断追求时代感&#xff0c;另一方面品牌也需要不断引领消费者需求&#xff0c;提升竞争力和产品力。 奶龙作为近年来异军突起…

项目中排查bug的思路案例

bug描述&#xff1a;调用了删除的接口&#xff0c;执行成功了&#xff0c;也删掉了选中的数据&#xff0c;但是不执行删除后的处理操作&#xff0c;会报一个“系统未知错误&#xff0c;请反馈给管理员” 解决&#xff1a; 成功删掉了数据&#xff0c;但删除后的操作没有执行&a…

欧瑞博智能家居掀起风潮 助力新加坡智慧国2.0发展

&#xff08;狮城快讯&#xff09;在新加坡智慧国2.0计划的推动下&#xff0c;智能科技日益融入生活&#xff0c;智慧社区建设成为提升生活品质的关键。智能家居品牌ORVIBO凭借创新的AI技术和优质用户体验&#xff0c;迅速成为本地智能家居的领导者&#xff0c;从别墅、公寓到H…

【AI人脸整合包及教程】FaceFusion 3.0.0:AI人脸技术的新高度

一、引言 在当今数字化时代&#xff0c;AI技术不断发展并渗透到各个领域&#xff0c;其中AI人脸技术尤为引人注目。FaceFusion 3.0.0作为这一领域的代表性工具&#xff0c;正引领着新的潮流。 二、FaceFusion 3.0.0的功能特点 高度精确的人脸效果 FaceFusion 3.0.0利用先进的…

OLED透明屏在零售行业有哪些优势

OLED透明屏在零售行业具有诸多优势&#xff0c;这些优势使得它成为零售行业中一种创新且高效的展示工具。以下是对OLED透明屏在零售行业优势的详细分析&#xff1a; 1. 视觉吸引力与沉浸感 高透明度&#xff1a;OLED透明屏能够实现40%以上的透明度&#xff0c;使得屏幕后的物体…

win10 pip 永久镜像

打开文件夹&#xff0c;找到目录 &#xff1a;C:\Users\xxx\AppData\Roaming // xxx是你的用户名 如果看不到AppData文件夹&#xff0c;可以点击上方的查看 &#xff0c;勾选上隐藏的项目即可 然后再Roaming 目录下创建文件夹 pip 在pip文件夹下面创建 pip.ini 文件&#xf…

计算机毕业设计 | SpringBoot+vue城镇保障性住房管理 公租房系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理城镇保障性住房管理系统的相关信…

软件测试学习笔记丨Selenium学习笔记:元素定位与操作

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22510 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

任我行协同CRM普及版 CommonDict/Edit SQL注入漏洞复现

0x01 产品简介 任我行协同CRM普及版是由成都市任我行信息技术有限公司开发的一款客户关系管理软件。该软件旨在帮助中小企业简化管理流程,提升客户管理能力,以及优化销售业绩。集成了CRM、OA、HR等多项功能于一体,为企业提供了一个全面的管理平台。该软件通过高度集成的解决…

JVM调优理论

JVM调优 文章目录 JVM调优理论JVM内存结构堆栈方法区&#xff08;逻辑上的划分&#xff0c;不同版本略有区别&#xff09; 类加载过程编译与反编译类加载过程 编译器优化机制字节码如何运行Hotspot的即时编译器分层编译找热点方法Hospot 内置的两类计数器 方法内联逃逸分析 垃圾…