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

6:OpenCV—图像滤波

过滤图像和视频

图像滤波是一种邻域运算,其中输出图像中任何给定像素的值是通过对相应输入像素附近的像素值应用某种算法来确定的。该技术通常用于平滑、锐化和检测图像和视频的边缘。
让我们了解在讨论图像过滤技术、内核和卷积时使用的一些术语的含义。

内核

内核是一个具有奇数高度和奇数宽度的矩阵。它也被称为卷积矩阵、掩码或滤波器。内核根据其值分布命名。内核用于在图像过滤操作中定义像素的邻域。一些流行的内核是规范化盒过滤器,高斯内核,拉普拉斯内核,边缘检测内核等。内核可以定义不同的大小。但是大内核会导致较长的处理时间。

这是一个 3 x 3 规范化框筛选器。此内核用于均匀平滑(模糊)。

这是一个 5 x 5 规范化框筛选器。该内核也用于均匀平滑。同样,您可以创建具有任何大小的归一化框过滤器,以用于均匀平滑。

这是一个 3 x 3 高斯核,用于高斯平滑(模糊)。

这是一个 5 x 5 高斯核,用于高斯平滑(模糊)。同样,您可以创建任何大小的高斯核。核的值分布应使用 2-D 高斯函数计算。

x, y 是原点位于中心的核的坐标。(即内核中心元素处的 x = 0 和 y = 0。**σ**是高斯分布的标准差。对于较大的标准差,需要更大的核才能准确执行高斯平滑。以下 5 x 5 高斯核的标准差为 1。

卷积

卷积是对图像执行的数学运算,方法是在整个图像上滑动内核,并根据内核的值和原始图像的重叠像素值计算每个像素的新值。


C22 = (K11 x A11 + K12 x A12 + K13 x A13) + (K21 x A21 + K22 x A22 + K23 x A23) + (K31 x A31 + K32 x A32 + K33 x A33)
C23 = (K11 x A12 + K12 x A13 + K13 x A14) + (K21 x A22 + K22 x A23 + K23 x A24) + (K31 x A32 + K32 x A33 + K33 x A34)
C24 = (K11 x A13 + K12 x A14 + K13 x A15) + (K21 x A23 + K22 x A24 + K23 x A25) + (K31 x A33 + K32 x A34 + K33 x A35)C32 = (K11 x A21 + K12 x A22 + K13 x A23) + (K21 x A31 + K22 x A32 + K23 x A33) + (K31 x A41 + K32 x A42 + K33 x A43)
C33 = (K11 x A22 + K12 x A23 + K13 x A24) + (K21 x A32 + K22 x A33 + K23 x A34) + (K31 x A42 + K32 x A43 + K33 x A44)

以同样的方式C34,可以在卷积图像中计算。但是卷积图像边界中的其他值(例如 C11、C12 等)不能以相同的方式计算,因为内核在边界处与原始图像部分重叠。因此,应计算非重叠的不存在的像素值,以确定卷积图像边界处的像素值。

均匀模糊

均匀模糊是平滑图像的最简单方法。它也被称为均匀平滑、均匀过滤和框模糊。在此技术中,每个像素值计算为内核定义的像素邻域的平均值。

均匀模糊中使用的内核称为归一化框滤波器。您可以根据需要为此内核定义任何大小。但最好定义宽度和高度为奇数大小的方形核。在下图中,我显示了 3 x 3 和 5 x 5 规范化框筛选器。

3x3 规范化框筛选器
5 x 5 标准化框筛选器

您必须选择正确大小的内核来定义每个像素的邻域。如果太大,图像的小特征可能会消失,图像看起来会模糊。如果它太小,则无法消除图像中的噪点。

使用OpenCV的图像上的均匀模糊

#include <QCoreApplication>
#include "opencv2/opencv.hpp"
#include "opencv/highgui.h"using namespace std;
using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 读取图像Mat image = imread("D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/lean_guitar.jpg");// 创建3X3和5X5的均匀滤波核并对读取图像进行均匀滤波处理Mat blur_3X3_img;Mat blur_5X5_img;blur(image, blur_3X3_img, Size(3, 3));blur(image, blur_5X5_img, Size(5, 5));string orignWd = "原始图像";string blurWd_3X3 = "3X3处理的图像";string blurWd_5X5 = "5X5处理的图像";namedWindow(orignWd);namedWindow(blurWd_3X3);namedWindow(blurWd_5X5);// 显示出来图像到窗口imshow(orignWd, image);imshow(blurWd_3X3, blur_3X3_img);imshow(blurWd_5X5, blur_5X5_img);waitKey(0);destroyAllWindows();return a.exec();
}
原始图像
使用 3 x 3 归一化框滤镜模糊图像
使用 5 x 5 归一化框滤镜模糊图像

代码解释


//Blur the image with 3x3 kernel
Mat image_blurred_with_3x3_kernel;
blur(image, image_blurred_with_3x3_kernel, Size(3, 3));

上述函数在原始图像上使用 3 x 3 归一化框滤镜执行均匀平滑/模糊操作,并将平滑的图像存储在 image_blurred_with_3x3_kernel Mat 对象中。原始图像中的每个通道都是独立处理的。


//Blur the image with 5x5 kernel
Mat image_blurred_with_5x5_kernel;
blur(image, image_blurred_with_5x5_kernel, Size(5, 5));

上述函数使用5 x 5归一化框滤镜对原始图像执行均匀平滑/模糊操作,并将平滑的图像存储在*image_blurred_with_5x5_kernel* Mat对象中。原始图像中的每个通道都是独立处理的。


//Define names of the window
String window_name = "The Guitar"; 
String window_name_blurred_with_3x3_kernel = "The Guitar Blurred with 3 x 3 Kernel";
String window_name_blurred_with_5x5_kernel = "The Guitar Blurred with 5 x 5 Kernel";// Create a window with above names
namedWindow(window_name);
namedWindow(window_name_blurred_with_3x3_kernel);
namedWindow(window_name_blurred_with_5x5_kernel);// Show our images inside the created windows.
imshow(window_name, image); 
imshow(window_name_blurred_with_3x3_kernel, image_blurred_with_3x3_kernel);
imshow(window_name_blurred_with_5x5_kernel, image_blurred_with_5x5_kernel);

上面的代码段创建窗口并在其中显示图像。

视频上的均匀模糊

#include <opencv2/opencv.hpp>
#include <iostream>
#include <QDebug>using namespace cv;
using namespace std;int main(int argc, char* argv[])
{//open the video file for readingVideoCapture cap("D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/点云应用.mp4");// if not success, exit programif (cap.isOpened() == false){qDebug() << "打开不读取的视频文件" << endl;cin.get(); //wait for any key pressreturn -1;}//Define names of the windowString window_name_of_original_video = "Original Video";String window_name_of_video_blurred_with_5x5_kernel = "Video Blurred with 5 x 5 Kernel";// Create a window with above namesnamedWindow(window_name_of_original_video, WINDOW_NORMAL);namedWindow(window_name_of_video_blurred_with_5x5_kernel, WINDOW_NORMAL);while (true){Mat frame;bool bSuccess = cap.read(frame); // read a new frame from videoif (bSuccess == false){qDebug() << "Found the end of the video" << endl;break;}//Blur the frame with 5x5 kernelMat frame_blurred_with_5x5_kernel;blur(frame, frame_blurred_with_5x5_kernel, Size(5, 5));//show the frames in the created windowsimshow(window_name_of_original_video, frame);imshow(window_name_of_video_blurred_with_5x5_kernel, frame_blurred_with_5x5_kernel);//wait for for 10 ms until any key is pressed.//If the 'Esc' key is pressed, break the while loop.//If the any other key is pressed, continue the loop//If any key is not pressed withing 10 ms, continue the loopif (waitKey(10) == 27){qDebug() << "按下ESC键,停止视频处理" << endl;break;}}return 0;}

高斯模糊

所谓模糊,可以理解成每一个像素都取周边像素的平均值。

高斯模糊/平滑是最常用的平滑技术,用于消除图像和视频中的噪点。在这种技术中,图像应该与高斯核卷积以产生平滑的图像。

您可以根据需要定义内核的大小。但是,在X和Y方向上高斯分布的标准差应仔细选择,考虑核的大小,以使核的边缘接近于零。在这里,我展示了 3 x 3 和 5 x 5 高斯核。

3 x 3 高斯核
5 x 5 高斯核

您必须选择正确大小的内核来定义每个像素的邻域。如果太大,图像的小特征可能会消失,图像看起来会模糊。如果它太小,则无法消除图像中的噪点。

3X3高斯模型过程

  1. 定义高斯函数: G(x, y) = (1 / (2 * π * σ^2)) * e^(-(x^2 + y^2) / (2 * σ^2)) 其中,x和y是偏移量,σ是高斯分布的标准差。

  2. 计算元素的值: 对于一个3x3的高斯核,中心元素位于(0, 0),即(行偏移量, 列偏移量) = (0, 0)。 将(x, y)代入高斯函数的公式中,可得到每个元素的值。

G(-1, -1) = (1 / (2 * π * σ^2)) * e^(-((-1)^2 + (-1)^2) / (2 * σ^2))

G(-1, 0) = (1 / (2 * π * σ^2)) * e^(-((-1)^2 + 0^2) / (2 * σ^2))

G(-1, 1) = (1 / (2 * π * σ^2)) * e^(-((-1)^2 + 1^2) / (2 * σ^2))

G(0, -1) = (1 / (2 * π * σ^2)) * e^(-(0^2 + (-1)^2) / (2 * σ^2))

G(0, 0) = (1 / (2 * π * σ^2)) * e^(-(0^2 + 0^2) / (2 * σ^2))

G(0, 1) = (1 / (2 * π * σ^2)) * e^(-(0^2 + 1^2) / (2 * σ^2))

G(1, -1) = (1 / (2 * π * σ^2)) * e^(-(1^2 + (-1)^2) / (2 * σ^2))

G(1, 0) = (1 / (2 * π * σ^2)) * e^(-(1^2 + 0^2) / (2 * σ^2))

G(1, 1) = (1 / (2 * π * σ^2)) * e^(-(1^2 + 1^2) / (2 * σ^2))

  1. 归一化: 将所有元素值相加并除以总和:G(-1, -1) + G(-1, 0) + G(-1, 1) + G(0, -1) + G(0, 0) + G(0, 1) + G(1, -1) + G(1, 0) + G(1, 1)

请注意,归一化是将所有元素的和调整为1,而不是单个元素的值。对于标准的高斯核,σ的值通常取1。代入σ=1进行计算,我们可以得到一个准确的3x3高斯核:

1/16 2/16 1/16

2/16 4/16 2/16

1/16 2/16 1/16

这是一个经过归一化处理的3x3高斯核,它满足所有元素之和为1。

对图像进行高斯模糊

#include <QCoreApplication>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 读取图像Mat image = imread("D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/lean_guitar.jpg");// 创建3X3和5X5的高斯滤波核并对读取图像进行高斯滤波处理Mat blur_3X3_img;Mat blur_5X5_img;GaussianBlur(image, blur_3X3_img, Size(3, 3), 0);GaussianBlur(image, blur_5X5_img, Size(9, 9), 0);string orignWd = "原始图像";string blurWd_3X3 = "3X3处理的图像";string blurWd_5X5 = "5X5处理的图像";namedWindow(orignWd);namedWindow(blurWd_3X3);namedWindow(blurWd_5X5);// 显示出来图像到窗口imshow(orignWd, image);imshow(blurWd_3X3, blur_3X3_img);imshow(blurWd_5X5, blur_5X5_img);waitKey(0);destroyAllWindows();return a.exec();
}
原始图像
使用 3 x 3 高斯核模糊图像
使用 5 x 5 高斯核模糊图像
代码解释

/Blur the image with 3x3 Gaussian kernel
Mat image_blurred_with_3x3_kernel;
GaussianBlur(image, image_blurred_with_3x3_kernel, Size(3, 3), 0);

上述函数在原始图像上使用 3 x 3 高斯滤波器执行高斯模糊/平滑操作,并将平滑的图像存储在 image_blurred_with_3x3_kernel Mat 对象中。原始图像中的每个通道都是独立处理的。内核的宽度和高度应该是奇数。高斯分布的 X 方向和 Y 方向的标准偏差将根据核的大小计算。


//Blur the image with 5x5 Gaussian kernel
Mat image_blurred_with_5x5_kernel;
GaussianBlur(image, image_blurred_with_5x5_kernel, Size(5, 5), 0);

上述函数使用5 x 5高斯滤波器对原始图像执行高斯模糊/平滑操作,并将平滑的图像存储在image_blurred_with_5x5_kernel Mat对象中。原始图像中的每个通道都是独立处理的。内核的宽度和高度应该是奇数。高斯分布的 X 方向和 Y 方向的标准偏差将根据核的大小计算。


//Define names of the windows
String window_name = "Lotus";
String window_name_blurred_with_3x3_kernel = "Lotus Blurred with 3 x 3 Gaussian Kernel";
String window_name_blurred_with_5x5_kernel = "Lotus Blurred with 5 x 5 Gaussian Kernel";// Create windows with above names
namedWindow(window_name);
namedWindow(window_name_blurred_with_3x3_kernel);
namedWindow(window_name_blurred_with_5x5_kernel);// Show our images inside the created windows.
imshow(window_name, image);
imshow(window_name_blurred_with_3x3_kernel, image_blurred_with_3x3_kernel);
imshow(window_name_blurred_with_5x5_kernel, image_blurred_with_5x5_kernel);

上面的代码段创建窗口并在其中显示图像。

视频上的高斯模糊

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char* argv[])
{//读取视频文件内容VideoCapture cap("D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/点云应用.mp4");//定义窗口名称String window_name_of_original_video = "原始视频";String window_name_of_video_blurred_with_5x5_kernel = "5X5高斯核处理的图像";// 根据前面的窗口标题创建窗口对象namedWindow(window_name_of_original_video, WINDOW_NORMAL);namedWindow(window_name_of_video_blurred_with_5x5_kernel, WINDOW_NORMAL);while (true){Mat frame;// 从视频中读取一帧bool bSuccess = cap.read(frame);if (bSuccess == false){cout << "视频已经读取完成" << endl;break;}//创建当前帧的5X5高斯核来平滑图像Mat frame_blurred_with_5x5_kernel;GaussianBlur(frame, frame_blurred_with_5x5_kernel, Size(5, 5), 0);//把当前帧平滑处理的图像显示到对应的窗口上imshow(window_name_of_original_video, frame);imshow(window_name_of_video_blurred_with_5x5_kernel, frame_blurred_with_5x5_kernel);// 等待10秒按下ESC键退出程序if (waitKey(10) == 27){cout << "按下ESC键,停止视频直播" << endl;break;}}return 0;}

反转图像

反转图像就像拍摄图像的负片。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <QDebug>using namespace cv;
using namespace std;int main()
{//定义原图像Mat color;//定义灰度图像,灰度图像反转后的图像Mat gray, grayDst;// 定义图像的高度和宽度int height, width;int i, j;//载入图片color = imread("D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/Car.jpg");if (color.empty()){qDebug() << "读取错误" << endl;return -1;}//获取图像信息height = color.rows;//列项要乘通道数width = color.cols * color.channels();qDebug()  << "彩色图片宽:" << color.cols << ", 高:" << color.rows << ",通道数:" << color.channels() << endl;qDebug()  << "实际宽:" << width << endl << endl << endl;// 定义窗口名称string originColor = "原彩色原图";string reverseColor = "反转彩色图像";//创建窗口namedWindow(originColor, WINDOW_AUTOSIZE);namedWindow(reverseColor, WINDOW_AUTOSIZE);//显示原图imshow(originColor, color);//彩色图像反转//算法:反转后的像素a = 255 - afor (i = 0; i < height; i++){for (j = 0; j < width; j++){color.at<uchar>(i, j) = 255 - color.at<uchar>(i, j);   //对每一个像素反转}}//保存反色后的图片cv::imwrite("outputColor.jpg", color);//显示反相图片imshow(reverseColor, color);//---------------------灰度图像反转------------------//灰度化,由原图获得灰度图像cvtColor(color, gray, COLOR_BGR2GRAY);//保存灰度图片cv::imwrite("gray.jpg", gray);// 获取灰度图的高height = gray.rows;//列项乘通道数// 获取灰度图的宽度width = gray.cols * gray.channels();qDebug()  << "灰度图片宽:" << gray.cols << ", 高:" << gray.rows << ",通道数:" << gray.channels() << endl;qDebug()  << "实际宽:" << width << endl << endl << endl;string grayTitle = "原灰度窗口";string grayReverseTitle = "反转灰度窗口";namedWindow(grayTitle, WINDOW_AUTOSIZE);namedWindow(grayReverseTitle, WINDOW_AUTOSIZE);//显示灰度图像imshow(grayTitle, gray);//灰度图像反转//算法:反转后的像素a = 255 - agrayDst = gray.clone();for (int i = 0; i < gray.rows; i++){for (int j = 0; j < gray.cols; j++){//灰度反转grayDst.at<uchar>(i, j) = 255 - gray.at<uchar>(i, j);}}//显示反转图像imshow(grayReverseTitle, grayDst);//保存反色后的图片imwrite("outputGray.jpg", grayDst);//暂停,保持图像显示waitKey(0);return 0;
}

基于opencv的五种滤波方法

方框滤波–> boxFilter函数来实现 –>线性滤波

均值滤波(邻域平均滤波)–> blur函数 –>线性滤波

高斯滤波–>GaussianBlur函数 –>线性滤波

中值滤波–>medianBlur函数 –>非线性滤波

双边滤波–>bilateralFilter函数 –>非线性滤波

方框滤波


boxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1,-1),bool normalize = true,int borderType = BORDER_DEFAULT )
  • src:输入图像
  • dst:输出图像
  • ddepth:输入图像的深度,-1 代表使用原图深度
  • ksize: 滤波内核的大小。一般这样写Size(w, h)来表示内核的大小,Size(10, 10)就表示 10x10 的核大小
  • anchor = Point(-1,-1) :表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1) 如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
  • normalize = true:默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了
  • borderType = BORDER_DEFAULT:用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

均值滤波


blur( InputArray src,OutputArray dst, Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT)
  • src:输入图像 。
  • dst:输出图像 。
  • ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。
  • anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。
  • boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT

高斯滤波

1
2
3
GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT )
  • src:输入图像 。
  • dst:输出图像 。
  • ksize:ksize.width 和 ksize.height 可以不同,但他们都必须为正数和奇数,或者为0,可由 sigma 计算而来
  • sigmaX:高斯核函数在 X 方向的的标准差
  • sigmaY:高斯核函数在 Y 方向的的标准差

若 sigmaY 为零,就将它设为 sigmaX;若 sigmaX 和 sigmaY 都是0,那么就由 ksize.width 和 ksize.height 计算出来

中值滤波

medianBlur(InputArray src,OutputArray dst,int ksize)
  • src:输入图像 。
  • dst:输出图像 。
  • ksize:孔径的线性尺寸,这个参数必须是大于1 的奇数

双边滤波


bilateralFilter(InputArray src,OutputArray dst, int d, double sigmaColor,double sigmaSpace, int borderType=BORDER_DEFAULT) 
  • src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
  • dst: 输出图像,和原图像有相同的尺寸和类型。
  • d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
  • sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
  • borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

上面所有滤波的综合案例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <QDebug>using namespace cv;
using namespace std;int main()
{// 读取图像Mat srcImg = imread("D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/lean_guitar.jpg");// 定义六个窗口的名称string srcTitle = "原始图像";string boxFilterTitle = "方框滤波";string blurTitle = "均值滤波";string gaussianTitle = "高斯滤波";string medianTitle = "中值滤波";string bilateralTitle = "双边滤波";// 创建6个窗口namedWindow(srcTitle, WINDOW_NORMAL);namedWindow(boxFilterTitle, WINDOW_NORMAL);namedWindow(blurTitle, WINDOW_NORMAL);namedWindow(gaussianTitle, WINDOW_NORMAL);namedWindow(medianTitle, WINDOW_NORMAL);namedWindow(bilateralTitle, WINDOW_NORMAL);// 显示原图imshow(srcTitle, srcImg);// 方框滤波处理Mat boxFilterImg;// 首先进行方框滤波处理boxFilter(srcImg, boxFilterImg, srcImg.depth(), Size(5,5));// 显示到对应窗口上imshow(boxFilterTitle, boxFilterImg);// 均值滤波处理Mat blurImg;// 首先进行均值滤波处理blur(srcImg, blurImg, Size(5,5));// 显示到对应窗口上imshow(blurTitle, blurImg);// 高斯率处理Mat gaussianImg;// 首先进行均值滤波处理GaussianBlur(srcImg, gaussianImg, Size(5,5), 0);// 显示到对应窗口上imshow(gaussianTitle, gaussianImg);// 中值滤波处理Mat medianImg;// 首先进行均值滤波处理medianBlur(srcImg, medianImg, 9);// 显示到对应窗口上imshow(medianTitle, medianImg);// 双边滤波处理Mat bilateralImg;// 首先进行均值滤波处理bilateralFilter(srcImg, bilateralImg, 11, 21, 19);// 显示到对应窗口上imshow(bilateralTitle, bilateralImg);waitKey(0);return 0;
}

相关文章:

6:OpenCV—图像滤波

过滤图像和视频 图像滤波是一种邻域运算&#xff0c;其中输出图像中任何给定像素的值是通过对相应输入像素附近的像素值应用某种算法来确定的。该技术通常用于平滑、锐化和检测图像和视频的边缘。 让我们了解在讨论图像过滤技术、内核和卷积时使用的一些术语的含义。 内核 内…...

pytorch语法学习

启动 python main.py --config llve.yml --path_y test -i output...

5:OpenCV—图像亮度、对比度变换

1.更改图像和视频的亮度 更改亮度 更改图像的亮度是常用的点操作。在此操作中&#xff0c;图像中每个像素的值应增加/减少一个常数。要更改视频的亮度&#xff0c;应对视频中的每一帧执行相同的操作。 如果要增加图像的亮度&#xff0c;则必须为图像中的每个像素添加一些正常…...

Oracle 的V$ACTIVE_SESSION_HISTORY 视图

Oracle 的V$ACTIVE_SESSION_HISTORY 视图 V$ACTIVE_SESSION_HISTORY显示数据库中的 Sampled Session 活动。 它包含每秒拍摄一次的活动数据库会话的快照。如果数据库会话位于 CPU 上或正在等待不属于等待类的事件&#xff0c;则认为该会话处于活动状态。请参阅 view 以了解有…...

redis数据持久化和配置-13(配置 AOF:Appendfsync 策略)

配置 AOF&#xff1a;Appendfsync 策略 在 Redis 中配置仅附加文件 &#xff08;AOF&#xff09; 持久性机制涉及选择正确的 appendfsync 策略。此策略指示 Redis 将数据写入磁盘上的 AOF 文件的频率。策略的选择会显著影响数据安全和性能。了解这些策略之间的权衡对于确保 Re…...

【Python 算法零基础 4.排序 ② 冒泡排序】

目录 一、引言 二、算法思想 三、时间复杂度和空间复杂度 1.时间复杂度 2.空间复杂度 四、冒泡排序的优缺点 1.算法的优点 2.算法的缺点 五、实战练习 88. 合并两个有序数组 算法与思路 ① 合并数组 ② 冒泡排序 2148. 元素计数 算法与思路 ① 排序 ② 初始化计数器 ③ 遍历数组…...

Python:操作Excel设置行高和列宽

Python 操作 Excel:轻松设置行高与列宽 📊✨ 在处理 Excel 表格时,除了正确展示数据本身,合理设置行高与列宽也是提升可读性和专业度的关键因素。本文将带你了解如何使用 Python 的 openpyxl 库,优雅地控制 Excel 表格的排版布局,实现行高、列宽的灵活设置与自动适配! …...

docker-volume-backup 备份 ragflow volumes

自定义项目名称 这里我自定义了 ragflow 项目的名称&#xff0c;修改 .env&#xff0c;添加环境配置 # 自定义项目名称 COMPOSE_PROJECT_NAMEragflow创建备份脚本配置文件 在 ragflow/docker 目录下创建文件 docker-compose-backup.yml version: 3services:backup:image: o…...

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享

乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体&#xff0c;不仅能直观呈现乡村发展全貌&#xff0c;还能为决策提供科学依据。本文以Axure为工具&#xff0c;结合实际案例&#xff0c;分享如何从零设计一个功能完备、交互流畅的数字乡村大…...

算法第26天 | 贪心算法、455.分发饼干、376. 摆动序列、 53. 最大子序和

弹性算法理论基础 想清楚 局部最优 是什么&#xff0c;如果可以推导出全局最优&#xff0c;那就是正确的贪心算法 455. 分发饼干 题目 思路与解法 class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:res 0i 0j 0g.sort()s.sort()whi…...

PDF处理控件Aspose.PDF教程:以编程方式将 PDF 导出为 JPG

在本节中&#xff0c;我们将探讨如何使用 Aspose.PDF 库将 PDF 文档转换为 JPG 图像。Aspose.PDF 是一个功能强大且用途广泛的库&#xff0c;专为需要以编程方式处理 PDF 文件的开发人员而设计。它提供了丰富的功能&#xff0c;可用于跨多个平台创建、编辑和转换 PDF 文档。其主…...

Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,

Vue3ElementPlus后台管理系统&#xff0c;支持白天黑夜主题切换&#xff0c;专为教育管理场景设计。主要功能包括用户管理&#xff08;管理员、教师、学生&#xff09;、课件资源管理&#xff08;课件列表、下载中心&#xff09;和数据统计&#xff08;使用情况、教学效率等&am…...

AI大模型应用之评测篇

在看到公司对于AI 工程师 的岗位要求 &#xff1a;“能够熟练使用各种自动化评测工具与方法&#xff0c;对AI 模型的输出进行有效评估” 时&#xff0c;其实比较疑惑&#xff0c;这个是对大模型能力例如像Deepseek ,GPT-4 ,千问&#xff0c;LLAMA这些模型的能力评测&#xff0c…...

力扣小题, 力扣113.路径总和II力扣.111二叉树的最小深度 力扣.221最大正方形力扣5.最长回文子串更加优秀的算法:中心扩展算法

目录 力扣113.路径总和II 力扣.111二叉树的最小深度 力扣.221最大正方形 力扣5.最长回文子串 更加优秀的算法:中心扩展算法 力扣113.路径总和II 这道题&#xff0c;让我明白回溯了到底啥意思 之前我找的时候&#xff0c;我一直在想&#xff0c;如果可以&#xff0c;请你对比…...

el-form elform 对齐方式调整

如下页面表单&#xff0c;展示后就很丑。 页面表单&#xff0c;有时候我们想着最左侧的应该合理整齐的左对齐&#xff0c;右侧的表单都是右对齐&#xff0c;这样页面看起来会整洁很多。 <el-form class"w-100 a_form" style"padding: 0 15px 0px 15px"…...

JESD204 ip核使用与例程分析(二)

JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…...

Linux shell 正则表达式高效使用

Linux正则表达式高效使用教程 正则表达式是Linux命令行中强大的文本处理工具&#xff0c;能够极大提高搜索和匹配效率。下面为新手提供一个简单教程&#xff0c;介绍如何在grep和find命令中使用正则表达式。 使用建议&#xff1a;使用grep时要加-E选项使其支持扩展正则表达式&…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Blurry Loading (毛玻璃加载)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— Blurry Loading 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ ✨ 组件目标 实现一个加载进度条&#xff0c;随着加载进度的…...

C#中的ThreadStart委托

ThreadStart 委托&#xff1a; ThreadStart 是 .NET 中的一个内置委托类型&#xff0c;表示无参数且无返回值的方法。其定义如下&#xff1a; public delegate void ThreadStart(); 通常用于定义线程的入口方法。 List<ThreadStart>&#xff1a; 这是一个泛型集合&…...

GPU加速Kubernetes集群助力音视频转码与AI工作负载扩展

容器编排与GPU计算的结合&#xff0c;为追求性能优化的企业开辟了战略转型的新路径 基于GPU的托管Kubernetes集群不仅是技术选择&#xff0c;更是彻底改变企业处理高负载任务的战略部署方式。 随着人工智能和机器学习项目激增、实时数据处理需求的剧增&#xff0c;以及高性能媒…...

LeetCode[222]完全二叉树的节点个数

思路&#xff1a; 这个节点个数可以使用递归左儿子个数递归右儿子个数1&#xff0c;这个1是根节点&#xff0c;最后结果为节点个数&#xff0c;但我们没有练习到完全二叉树的性质. 完全二叉树的性质是&#xff1a;我简单说一下&#xff0c;大概就是其他节点都满了&#xff0c;就…...

DPDK 技术详解:榨干网络性能的“瑞士军刀”

你是否曾感觉&#xff0c;即使拥有顶级的服务器和万兆网卡&#xff0c;你的网络应用也总是“喂不饱”硬件&#xff0c;性能总差那么一口气&#xff1f;传统的网络处理方式&#xff0c;就像在高速公路上设置了太多的收费站和检查点&#xff0c;限制了数据包的“奔跑”速度。 今…...

anaconda的c++环境与ros2需要的系统变量c++环境冲突

在conda虚拟环境中运行有ros2的代码报错 ImportError: /home/user/anaconda3/envs/myenv/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found(required by /opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/_rclpy_pybind11.cpython-310-x86_64-linux-gnu.…...

Docker 疑难杂症解决指南大纲

一、Docker 基础问题排查 Docker 服务无法启动 错误提示:Cannot connect to the Docker daemon 可能原因:Docker 服务未运行、权限问题、端口冲突。 解决方案: 检查服务状态:systemctl status docker 重启服务:systemctl restart docker 用户权限:将用户加入 docker 组。…...

深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务

深入解析Spring Boot与Kafka集成&#xff1a;构建高效消息驱动微服务 引言 在现代微服务架构中&#xff0c;消息队列是实现服务解耦和异步通信的重要组件。Apache Kafka作为分布式流处理平台&#xff0c;因其高吞吐量、低延迟和可扩展性&#xff0c;成为企业级应用的首选。本…...

Python 实现web请求与响应

目录 一、什么是web 请求与响应&#xff1f; 1、Web 请求 2、web 响应 3、HTTP协议概述 4、常见的HTTP状态码包括 二、Python 的requests库 1、安装requests库 2、发送GET请求 3、发送POST请求 4、处理响应头和状态码 5、发送带查询参数的GET请求 6、发送带表单数据…...

演示:【WPF-WinCC3D】 3D工业组态监控平台源代码

一、目的&#xff1a;分享一个应用WPF 3D开发的3D工业组态监控平台源代码 二、功能介绍 WPF-WinCC3D是基于 WPF 3D研发的工业组态软件&#xff0c;提供将近200个预置工业模型&#xff08;机械手臂、科幻零部件、熔炼生产线、机加生产线、管道等&#xff09;&#xff0c;支持组态…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.4 数据库与表的基本操作(DDL/DML语句)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.4 数据库与表的基本操作&#xff08;DDL/DML语句&#xff09;1.4.1 数据库生命周期管理&#xff08;DDL核心&#xff09;1.4.1.1 创建数据库&#xff08;CREATE DATABASE&…...

CUDA加速的线性代数求解器库cuSOLVER

cuSOLVER是NVIDIA提供的GPU加速线性代数库&#xff0c;专注于稠密和稀疏矩阵的高级线性代数运算。它建立在cuBLAS和cuSPARSE之上&#xff0c;提供了更高级的线性代数功能。 cuSOLVER主要功能 1. 稠密矩阵运算 矩阵分解: LU分解 (gesvd) QR分解 (geqrf) Cholesky分解 (potrf…...

Oracle 物理存储与逻辑管理

1. 表空间&#xff08;Tablespace&#xff09; 定义&#xff1a; 表空间是Oracle中最高级别的逻辑存储容器&#xff0c;由一个或多个物理数据文件&#xff08;Datafile&#xff09;组成。所有数据库对象&#xff08;如表、索引&#xff09;的逻辑存储均属于某个表空间。 类型与…...