OpenCV——图像平滑

图像平滑

  • 一、图像的噪声
    • 1.1、噪声来源
    • 1.2、噪声类型
    • 1.3、噪声模拟
  • 二、滤波器
  • 三、线性滤波
    • 3.1、均值滤波
    • 3.2、方框滤波
    • 3.3、高斯滤波
  • 四、非线性滤波
    • 4.1、中值滤波
    • 4.2、双边滤波

图像在采集和传输过程中容易受到各种因素的影响而产生噪声,而噪声会对图像的正确解读和处理产生干扰,因此去除图像中的噪声十分重要。去除图像中噪声的过程为图像平滑,或图像去噪、图像模糊。

噪声信号主要集中在高频段,图像平滑从信号处理的角度看就是去除高频信号,保留低频信号,因而属于低通滤波。与低通滤波相对应的是高通滤波,边缘检测、锐化等操作就属于高通滤波。

图像滤波是指在尽可能保留图像细节特征的前提下去除噪声或者提取需要的信息。图像滤波又可分为线性滤波和非线性滤波。滤波器的种类很多,在OpenCV中,用于图像平滑处理的滤波器主要有5种,这5种滤波器及相应的函数如下:

  • 均值滤波:blur()函数
  • 方框滤波:boxFilter()函数
  • 高斯滤波:GaussianBlur()函数
  • 中值滤波:medianBlur()函数
  • 双边滤波:bilateralFilter()函数

这5种滤波器中,均值滤波、方框滤波和高斯滤波属于线性滤波,中值滤波和双边滤波则属于非线性滤波。

一、图像的噪声

噪声在图像上常表现为随机的、离散的、孤立的像素或像素块,而且往往比较显眼。噪声通常是不必要或多余的信息,不但无用还会干扰人们对有用信息的接受。

1.1、噪声来源

噪声的产生主要有以下有两个来源:

1. 图像获取过程:

图像传感器在采集图像过程中,受传感器材料属性、工作环境等因素的影响,会引入各种噪声。

2. 图像传输过程:
由于传输介质和存储设备等方面的原因,数字图像在传输过程中受到各种噪声的污染。另外,在图像处理的某些环节也可能产生噪声。

1.2、噪声类型

噪声通常可分为高斯噪声、椒盐噪声、泊松噪声和乘性噪声等:

  • 椒盐噪声:椒盐噪声也称为脉冲噪声,是一种随机生成的亮点或暗点,因为形似椒盐而得名。椒盐噪声的成因可能是传感器等硬件问题,也可能是环境中强烈的电磁干扰。
  • 高斯噪声:高斯噪声是指概率密度函数符合高斯分布的一类噪声。高斯分布有均值u和标准差a两个参数,其中u是正态分布的位置参数,用于描述正态分布的集中趋势位置,a则用于描述正态分布的离散程度。高斯噪声产生的主要原因如下:
    • 拍摄时照明不够且亮度不均匀
    • 元器件自身的噪声及相互影响
    • 相机等设备长时间工作导致温度过高

1.3、噪声模拟

OpenCV中没有专门产生椒盐噪声和高斯噪声的函数,不过都可以通过随机函数来模拟。

public class Peppersalt {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat img = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo2/shaomai.png");HighGui.imshow("img", img);HighGui.waitKey(0);int row = img.rows();int col = img.cols();//定义黑白两种颜色double[] black = new double[] {0, 0, 0};double[] white = new double[] {255, 255, 255};//用于获取随机数的RandomRandom r = new Random();for (int n = 0; n < 20000; n++) {//随机获得行号、列号及噪点颜色int i = r.nextInt(row);int j = r.nextInt(col);boolean isBlack = r.nextBoolean();//在相应的像素上加上黑白噪点if (isBlack) {img.put(i, j, black);} else {img.put(i, j, white);}}//在屏幕上显示加了椒盐噪声的图像HighGui.imshow("Peppersalt", img);HighGui.waitKey(0);System.exit(0);}
}

原图:

在这里插入图片描述

添加噪声后:
在这里插入图片描述

二、滤波器

为了去除图像中的噪声,需要对图像进行平滑处理,而滤波器可以实现这个功能。滤波器和像素运算的区别在于,像素运算只作用于一像素,而滤波器则通常会用到原图像中的多像素进行计算。

一些常见的滤波器如下:

//均值滤波1 1 1	
1/9   1 1 11 1 1 
//边缘检测
0  1  0
1 -4  1
0  1  0
//高斯滤波1 2 1
1/16  	 2 4 21 2 1
//锐化0 -1  0
-1  5 -10 -1  0

滤波器在某些情况下也被称为卷积核,下面为一个基础的卷积函数:

void Imgproc.filter2D(Mat src, Mat dst, int ddepth, Mat Kernel)
  • src:输入图像
  • dst:输出图像,与src具有相同的尺寸和通道数
  • ddepth:输出图像的深度,如设置为-1,则表示自动选择
  • Kernel:卷积核,要求是单通道浮点类型矩阵;如果不同的通道需要应用不同的卷积核,则应将图像拆分后单独处理。卷积核的锚点应该位于卷积核中。默认状态下,锚点位于卷积核的中心。
public class Filter2D {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/fish.png");HighGui.imshow("src", src);HighGui.waitKey(0);//用于均值滤波的卷积核Mat k1 = new Mat(3, 3, CvType.CV_64F);double[] data3 = new double[]{0.111, 0.111, 0.111,0.111, 0.111, 0.111,0.111, 0.111, 0.111};k1.put(0, 0, data3);//均值滤波并显示Mat dst = new Mat();Imgproc.filter2D(src, dst, -1, k1);HighGui.imshow("blur", dst);HighGui.waitKey(0);//用于锐化的卷积核Mat k2 = new Mat(3, 3, CvType.CV_64F);double[] data = new double[] {0, -1, 0,-1, 5, -1};k2.put(0, 0, data);//锐化操作并在屏幕上显示Imgproc.filter2D(src, dst, -1, k2);HighGui.imshow("Sharpen1", dst);HighGui.waitKey(0);//调整过的锐化卷积核Mat k3 = new Mat(3, 3, CvType.CV_64F);double[] data2 = new double[] {0, -0.5, 0,-0.5, 2.5, -0.5};k3.put(0, 0, data2);//用调整过的锐化卷积核进行锐化并显示Imgproc.filter2D(src, dst, -1, k3);HighGui.imshow("Sharpen2", dst);HighGui.waitKey(0);System.exit(0);}
}

程序定义了3个卷积核,其中第一个用于均值滤波,第二个用于锐化,由于这个卷积核相加并不等于1,卷积操作后的图像偏亮,第三个卷积核对第二个进行了调整。

原图像:

在这里插入图片描述

均值滤波后:
在这里插入图片描述

锐化后:

在这里插入图片描述

调整锐化后:

在这里插入图片描述

由此可见,卷积核设置不当会使输出图像异常,通常情况下需要通过处理使卷积核中所有数字相加等于1。

在介绍具体的滤波函数之前,需要了解一下图像的边界处理。边界处理的必要性可以用卷积计算过程来说明,如下所示。这是均值滤波时卷积计算的过程,输入矩阵尺寸为33,其中中央像素的值为5。经过卷积计算以后,该像素的值变为20,在计算过程中用到了该像素周边33区域的所有像素值。在计算其余像素的值时,由于外围已经没有像素,取值会出现问题。假如规定在卷积计算时必须取到9个数,那么其余像素就会因为无法计算而使输出矩阵的尺寸缩小。这样33的矩阵经过卷积运算后尺寸会缩小为11。如果每次滤波矩阵尺寸都要缩小,则经过多次处理后的矩阵会小得不成样子,而这通常是不可接受的,因此,在大多数滤波器的实现过程中,需要对图像的边界做特殊处理。

在处理边界区域问题时常有以下几种方法:

  1. 将未处理的边界像素赋值为常数,例如黑色。这种方法非常简单,但滤波后图像的有效尺寸(黑色以外部分)还是缩小了。
  2. 将未处理的边界像素赋值为原图像相同位置的像素值。这种方法也不理想,因为滤波前后的像素值往往存在明显的差异。
  3. 在边界外填充额外的像素对图像进行扩充,然后对边界区域进行滤波。这种方法又可细分为以下几种:
    • 将图像边界外的像素设为常数,例如黑色或灰色。这种方式虽然简单,但滤波后的图像边界处仍会有明显的差异,特别是滤波器尺寸较大时。
    • 将图像的边界像素填充至边界外。相对来讲,这种方法的差异不算明显,也比较容易实现,因而常被选用。
    • 其他填充法。
1  15  27			1 1 1
25  5   3	* 1/9   1 1 1	= 20
11  3  90			1 1 1

三、线性滤波

3.1、均值滤波

均值滤波用邻域内所有像素值的平均值来取代原来的像素值。卷积核内的每个数值代表对应像素在计算时的权重,而均值滤波的卷积核内所有数值都是相同的,这意味着邻域内所有像素的权重相同。均值滤波后某像素的值等于邻域内所有像素的算数平均值,计算过程如下:

1  15  27		   1 1 1
25  5  3	 * 1/9 1 1 1 = 20
11  3  90		   1 1 1(1+15+27+25+5+3+11+3+90)/9=20

均值滤波时邻域的大小会直接影响平滑的效果。邻域越大平滑的效果越好,但图像也会变得越模糊。邻域过大还会使图像的边缘信息损失严重,因此合理选择邻域的大小非常重要。

均值滤波可以消除像素值急剧变化引起的噪声,从而使图像趋于平滑,但均值滤波也会使图像失去某些细节而变得模糊。OpenCV中用于均值滤波的函数原型如下:

//用归一化的方框滤波器对图像进行平滑处理
void Imgproc.blur(Mat src, Mat dst, Size ksize, Point anchor, int borderType)
  • src:输入图像,通道数不限,但图像深度必须是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F
  • dst:输出图像,和src具有相同的尺寸和数据类型
  • ksize:卷积核尺寸
  • anchor:锚点,默认值(-1, -1)表示锚点位于卷积核的中心
  • borderType:像素外推法的边界类型,可选参数如下:
    • Core.BORDER_CONSTANT:用特定值填充,如iiiiii|abcdefgh|iiiiiii中用i填充
    • Core.BORDER_REPLICATE:两端复制填充,如aaaaaa|abcdefgh|hhhhhhh
    • Core.BORDER_REFLECT:倒序填充,如fedcba|abcdefgh|hgfedcb
    • Core.BORDER_WRAP:正序填充,如cdefgh|abcdefgh|abcdefg
    • Core.BORDER_REFLECT_101:不含边界值的倒序填充,如gfedcb|abcdefgh|gfedcba
    • Core.BORDER_TRANSPARENT:随机填充,如uvwxyz|abcdefgh|ijklmno
    • Core.BORDER_REFLECT101:同Core.BORDER_REFLECT_101
    • Core.BORDER_DEFAULT:同Core.BORDER_REFLECT_101
    • Core.BORDER_ISOLATED:忽略感兴趣区域(ROI)以外部分
public class Blur {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo2/pond.png");HighGui.imshow("src", src);HighGui.waitKey(0);//对图像进行均值滤波5*5并显示Mat dst = new Mat();Point anchor = new Point(-1, -1);int borderType = Core.BORDER_REPLICATE;Imgproc.blur(src, dst, new Size(5, 5), anchor, borderType);HighGui.imshow("blur 5*5", dst);HighGui.waitKey(0);//对图像进行均值滤波7*7并显示Imgproc.blur(src, dst, new Size(7, 7));HighGui.imshow("blur 7*7", dst);HighGui.waitKey(0);//对图像进行均值滤波11*11并显示Imgproc.blur(src, dst, new Size(11, 11));HighGui.imshow("blur 11*11", dst);HighGui.waitKey(0);System.exit(0);}
}

原图:
在这里插入图片描述

5*5滤波:
在这里插入图片描述

7*7滤波:
在这里插入图片描述

11*11滤波:
在这里插入图片描述

3.2、方框滤波

实际上,均值滤波是方框滤波的一种特殊形式。均值滤波对窗口内的像素计算算术平均值,是归一化以后的结果,而方框滤波则可以选择不进行归一化。

//用方框滤波器对图像进行平滑处理
void Imgproc.boxFilter(Mat src, Mat dst, int ddepth, Size ksize, Point anchor, boolean normallize)
  • src:输入图像
  • dst:输出图像,和src具有相同的尺寸和数据类型
  • ddepth:输出图像的深度。-1表示使用输入图像的深度
  • ksize:卷积核的尺寸
  • anchor:卷积核的锚点,默认值(-1,-1)表示锚点位于卷积核的中心
  • normalize:是否进行归一化
public class BoxFilter {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src = Imgcodecs.imread("/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/pond.png");HighGui.imshow("src", src);HighGui.waitKey(0);//对图像进行方框滤波(不归一化)并在屏幕上显示Mat dst = new Mat();Imgproc.boxFilter(src, dst, -1, new Size(3, 3), new Point(-1, -1), false);HighGui.imshow("Unnormalized", dst);HighGui.waitKey(0);//对图像进行方框滤波(归一化)并在屏幕上显示Imgproc.boxFilter(src, dst, -1, new Size(3, 3), new Point(-1, -1), true);HighGui.imshow("normlized", dst);HighGui.waitKey(0);System.exit(0);}
}

原图:
在这里插入图片描述

不归一化方框滤波:
在这里插入图片描述

归一化滤波:

在这里插入图片描述

其中未归一化的图像白化严重。未归一化的方框滤波将像素值相加却不平均,如果相加后超过255就会变成白色,于是图像中出现了大片白色。

3.3、高斯滤波

高斯滤波也是一种线性滤波。高斯滤波实际上是对邻域内的像素值进行加权平均,但高斯滤波器考虑了像素离过滤器中心的距离因素,距离越近权重越大,距离越远权重越小。

1  15  27        1 2 1
25  5  3  * 1/10 2 4 2 = 15
11  3  90        1 2 1
//加权平均 (1*1+15*2+27*1+25*2+5*4+3*2+11*1+3*2+90*1)/16=15
//用高斯滤波器对图像进行平滑处理
void Imgproc.GaussianBlur(Mat src, Mat dst, Size ksize, double sigmax, double sigmay)
  • src:输入图像。图像的通道数不限,但深度必须是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
  • dst:输出图像,和src具有相同的尺寸和数据类型
  • ksize:高斯滤波器尺寸,该尺寸必须是正奇数。如尺寸为0,则根据sigma计算尺寸
  • sigmax:高斯滤波器在X方向的标准差
  • sigmay:高斯滤波器在Y方向的标准差,如果sigmay为0,则认为其等于sigmax,如果sigmax和sigmay均为0,则根据ksize计算
public class GaussianBlur {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src = Imgcodecs.imread("/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/pond.png");HighGui.imshow("src", src);HighGui.waitKey(0);//对图像进行高斯滤波5*5并显示Mat dst = new Mat();Imgproc.GaussianBlur(src, dst, new Size(5, 5), 10, 10);HighGui.imshow("Gaussian 5*5", dst);HighGui.waitKey(0);//对图像进行高斯滤波7*7并显示Imgproc.GaussianBlur(src, dst, new Size(7, 7), 10, 10);HighGui.imshow("Gaussian 7*7", dst);HighGui.waitKey(0);//对图像进行高斯滤波11*11并显示Imgproc.GaussianBlur(src, dst, new Size(11, 11), 10, 10);HighGui.imshow("Gaussian 11*11", dst);HighGui.waitKey(0);System.exit(0);}
}

5*5:

在这里插入图片描述

7*7:
在这里插入图片描述

11*11:
在这里插入图片描述

四、非线性滤波

与线性滤波不同,非线性滤波时的像素值不是通过线性运算得来的,而是通过排序或逻辑运算等方式得来的。

4.1、中值滤波

中值滤波是一种典型的非线性滤波奇数,具体方法是邻域内像素值的中值来取代原有像素值。中值也叫中位数,是指把多个数值按升序或降序进行排序,位于序列中央位置的数字就是中位数。

1  15  27
25  5  3
11  3  90
//排序
1,3,3,5,  11,  15,25,27,90
//中位数为11

中值滤波用于某像素邻域内的中值代替该像素,利于消除孤立的噪声点从而使周围的像素更接近真实值,因而对于椒盐噪声和斑点噪声非常有效。中值是一个排序后的值,可以认为其结果是由邻域像素中的"大多数"决定的。邻域中出现的个别特别高或特别低的像素值并不会对结果产生太大影响,只是使排序结果向前或向后移动了一位,因此,相对于均值而言,中值对邻域中的像素值更具有代表性。在均值滤波或高斯滤波中,由于噪声成分也被加入计算之中,所以输出或多或少会受到噪声的影响,而在中值滤波器中,噪声在排序中很难被选上,所以对输出几乎没有影响,因此,中值滤波的去噪效果比线性滤波更好一些,但是,中值滤波也有其缺陷。由于需要对邻域内所有像素值进行排序,中值滤波花费的时间可能达到均值滤波的5倍以上。

//用中值滤波器对图像进行平滑处理
void Imgproc.medianBlur(Mat src, Mat dst, int ksize)
  • src:输入图像,通道数可以是1、3或4.如果滤波器尺寸是3或5,则图像深度应为CV_8U、CV_16U或CV_32F:如尺寸更大,则必须是CV_8U。
  • dst:输出图像,和src具有相同的尺寸的数据类型
  • ksize:滤波器尺寸,必须是大于1的奇数,如3、5、7等
public class MedianBlur {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src = Imgcodecs.imread("/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/peppersalt.png");HighGui.imshow("src", src);HighGui.waitKey(0);//对图像进行中中值滤波并显示Mat dst = new Mat();Imgproc.medianBlur(src, dst, 5);HighGui.imshow("MedianBlur", dst);HighGui.waitKey(0);//对图像进行均值滤波并显示Imgproc.blur(src, dst, new Size(5, 5));HighGui.imshow("Blur", dst);HighGui.waitKey(0);//对图像进行高斯滤波并显示Imgproc.GaussianBlur(src, dst, new Size(5, 5), 10, 10);HighGui.imshow("Gaussian Blur", dst);HighGui.waitKey(0);System.exit(0);}
}

原图:

在这里插入图片描述

中值滤波:
在这里插入图片描述

均值滤波:
在这里插入图片描述

高斯滤波:

在这里插入图片描述

4.2、双边滤波

双边滤波(Bilateral Filter)也是一种非线性的滤波方法,是一种常用的能够保留边缘信息的滤波方法。双边滤波实际上是空间域(Spatial Domain)和值域(Range Domain)两个滤波器综合作用的结果。在图像的平坦区域,像素值变化很小,空间域权重起主导作用,此时的双边滤波相当于高斯滤波;在图像的边缘区域,像素值变化很大,值域权重变大,边缘信息得以保留。

//用双边滤波器对图像进行处理
void Imgproc.bilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace)
  • src:输入图像,必须是单通道或三通道,图像深度应为CV_8U、CV_32F或CV_64F。
  • dst:输出图像,和src具有相同的尺寸和数据类型
  • d:滤波时每像素邻域的直径。如为非正数,则由sigmaSpace计算而来
  • sigmaColor:颜色空间的sigma参数。此参数越大意味着像素邻域中有越多颜色被混合在一起。半相等色的面积也越大。
  • sigmaSpace:坐标空间的sigma参数。此参数越大意味着只要像素的颜色足够接近,更远的像素会彼此影响。当d>0时,邻域尺寸不考虑sigamaSpace,否则d与sigamaSpace成正比

双边滤波器能在消减噪声的同时保持边缘的清晰,但双边滤波器比大多数滤波器要慢很多。在设置双边滤波的参数时应注意以下两点:

  • 为了简单起见可以将两个sigma值设为同一个值。当sigma值小于10时效果并不明显,但当数值较大(>150)时效果会非常显著,图像还会带有卡通风格
  • 滤波器的直径较大(>5)时速度非常慢,因此实时处理时推荐值为5,在离线处理含有大量噪声的图像时可设为9
public class BilateralFilter {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src = Imgcodecs.imread("/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/butterfly.png");HighGui.imshow("src", src);HighGui.waitKey(0);//对图像进行双边滤波并在屏幕上显示Mat dst = new Mat();Imgproc.bilateralFilter(src, dst, 9, 20, 20);HighGui.imshow("Bilateral", dst);HighGui.waitKey(0);//对图像进行均值滤波并显示Imgproc.blur(src, dst, new Size(5, 5));HighGui.imshow("Blur", dst);HighGui.waitKey(0);//对图像进行高斯滤波并显示Imgproc.GaussianBlur(src, dst, new Size(5, 5), 10, 10);HighGui.imshow("Gaussian", dst);HighGui.waitKey(0);System.exit(0);}
}

原图:

在这里插入图片描述

双边滤波:
在这里插入图片描述

均值滤波:
在这里插入图片描述

高斯滤波:
在这里插入图片描述

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

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

相关文章

鸿蒙系统备份恢复

鸿蒙系统尝试者&#xff0c;在纯血鸿蒙与鸿蒙4.2/4.3之前反复横跳&#xff0c;中间折腾… 目录 鸿蒙4.2/4.3升级鸿蒙5.0系统备份 鸿蒙5.0回退鸿蒙4.2/4.3系统备份备份恢复 华为手机助手注意 鸿蒙4.2/4.3升级鸿蒙5.0 系统备份 云空间备份手机本地备份华为手机助手备份 鸿蒙5.…

JS进阶 Day03

1.两种面向编程思想 2.构造函数实现封装以及存在的问题 下面就引出了原型对象 3.原型对象prototype 共享原理图&#xff1a; 4.数组扩展案例-求最大值和数组求和 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

visual studio小番茄插件某些快捷键失效

问题 AltO 切换头文件和源文件失效。 背景 最近升级了 visual studio&#xff0c;多了一些插件 原因 Alt O 快捷键被其他插件占用了 解决方案 工具 → 选项 → 环境 → 键盘 搜索这个 VAssistX.OpenCorrespondingFile&#xff08;切换头/源文件&#xff09; 发现命令的快…

基于单片机的PT100温度变送器设计

基于单片机的PT100温度变送器设计 文章目录 基于单片机的PT100温度变送器设计前言一、资源分享二、系统框架三、硬件准备1.主控制器2、PT100温度传感器3、显示屏4、WIFI模块5、USB转RS485模块6、SP3485EN7、K11-11D3 四、设计PCB1、安装下载立创EDA专业版2、画原理图3、摆放元器…

Git 清理指南:如何从版本库中移除误提交的文件(保留本地文件)

场景 在 Git 项目中&#xff0c;我们可能会不小心提交了本应忽略的文件&#xff08;如 node_modules/、.env、*.log 等&#xff09;&#xff0c;导致仓库体积膨胀或敏感信息泄露。本文介绍如何从 Git 历史中彻底删除这些文件&#xff0c;同时保留本地文件。 解决方案 1. 确认…

服务器数据恢复—重装系统导致XFS文件系统分区无法访问的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器上通过磁盘柜RAID卡组建的riad5磁盘阵列&#xff0c;服务器上层安装Linux操作系统&#xff0c;搭建XFS文件系统。服务器上层分配一个LUN&#xff0c;并划分了两个分区。通过LVM扩容的方式将sdc1分区加入到了root_lv中&#…

在QtCreator中使用GitHubCopilot

文章目录 1.github copilot账号2. 安装node.js3.安装 GitHub Copilot Neovim plugin4.在Qt中启用4.1.在extension中启用4.2.在配置中启用4.3.使用/禁用 5.评价 在最新版的QtCreator中&#xff0c;已经通过Extension集成了GitHubCopilot进来。 我用的是16.0.2版本的&#xff08;…

岛屿周长问题的三种解法:直接计数法、数学计算法与深度优先搜索

问题描述 给定一个二维网格 grid&#xff0c;其中1表示陆地&#xff0c;0表示水域。网格中的格子水平和垂直方向相连&#xff08;对角线不相连&#xff09;。网格中恰好有一个岛屿&#xff08;即一个或多个相连的陆地格子&#xff09;&#xff0c;需要计算这个岛屿的周长。 解…

将包含父子关系的扁平列表 List<Demo> 转换成树形结构的 List<DemoVO>,每个节点包含自己的子节点列表

1.stream递归操作 private List<DemoVO> createtree(List<Demo> datas) {//得到父节点return datas.stream().filter(m -> TargetConstants.ROOT.equalsIgnoreCase(m.getParentId())).map(m -> {DemoVO vo new DemoVO();vo.setTaxonomyId(m.getPlatformTaxo…

【Jmeter】Jmeter 高并发性能压力测试

目录 一、下载 Jmeter 二、配置环境变量 三、设置中文语言 四、入门最简单的高并发性能压测流程 1. 添加线程组 2. 添加请求 3. 添加监听器 3.1 添加聚合报告 3.2 添加结果树 4. 启动测试 2 种启动方式&#xff1a; 查看结果树&#xff1a; 聚合报告&#xff1a; 五…

芯片测试之VIL/VIH(输入电平)Test全解析:从原理到实战

大家好&#xff0c;我是硅言。在数字芯片的“沟通体系”中&#xff0c;​​VIL&#xff08;输入低电平&#xff09;​​和​​VIH&#xff08;输入高电平&#xff09;​​如同芯片的“听觉阈值”&#xff0c;决定了它能否准确识别外部信号的逻辑状态。本文将从原理剖析、测试方…

【WPF】MVVM的消息机制

在WVM&#xff08;Model-View-ViewModel&#xff09;架构中&#xff0c;消息机制主要用于实现ViewModel与View之间的通信&#xff0c;同时保持它们的分离。这对于维护代码的清晰度和可测试性非常重要。在WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中…

以楼宇自控关键技术,夯实现代低碳建筑发展重要基础

当“碳达峰、碳中和”成为全球发展共识&#xff0c;建筑行业作为能源消耗与碳排放的重要领域&#xff0c;正加速向低碳化转型。在这场绿色变革中&#xff0c;楼宇自控技术凭借对建筑设备的智能管控与能源优化能力&#xff0c;成为现代低碳建筑建设的核心支撑。从数据采集到智能…

西电【信息与内容安全】课程期末复习笔记

西电【信息与内容安全】课程期末复习笔记 来自2022年春的古早遗留档案&#xff0c;有人需要这个&#xff0c;我就再发一下吧。 ‍ 平时成绩&#xff1a; 10%。线上&#xff1a; 10% &#xff08;线上学习内容&#xff0c; 共 100 分。&#xff09;实验&#xff1a; 10% &#…

【论文阅读笔记】ICLR 2025 | 解析Ref-Gaussian如何实现高质量可交互反射渲染

Reflective Gaussian Splatting Info 会议 【ICLR 2025】 作者 复旦大学&#xff0c;萨里大学&#xff1b;复旦张力教授团队 Github地址 https://github.com/fudan-zvg/ref-gaussian.git Project地址 https://fudan-zvg.github.io/ref-gaussian/ Abstract 新视图合成得益…

面向GPU、CPU及机器学习加速器的机器学习编译器

机器学习编译器概述 机器学习编译器是一种专门针对机器学习工作负载设计的工具&#xff0c;旨在将高层模型描述&#xff08;如TensorFlow或PyTorch模型&#xff09;高效编译为可在不同硬件&#xff08;如GPU、CPU或专用加速器&#xff09;上执行的底层代码。其核心目标是优化计…

论文分类打榜赛Baseline(2):InternLM昇腾硬件微调实践

本文来自社区投稿&#xff0c;作者丁一超 书生大模型实战营第5期已正式启动&#xff0c;本期实战营新增「论文分类打榜赛」&#xff0c;以帮助学员更好地掌握大模型技能。 本文将手把手带领大家如何基于昇腾微调 InternLM 模型&#xff0c;轻松上手论文自动分类任务。从环境配…

mac安装mvnd结合idea

mac安装mvnd结合idea hi&#xff0c;我是阿昌&#xff0c;今天记录一下mac系统下如何安装mvnd同时通过maven-helper插件配置mvnd命令&#xff0c;提升编译速度&#xff1b; 0、前言 如果你正在开发一个由大量模块组成的大型项目&#xff0c;Gradle可以让大型项目构建的更快&…

扩展模块--QWebEngine功能及架构解析

Qt WebEngine 模块在 Qt 6.9 中提供了基于 Chromium 的网页渲染引擎功能。 一、主要功能 核心功能 网页渲染引擎 基于 Chromium 项目的最新稳定版本 支持现代 HTML5、CSS3 和 JavaScript 标准 主要组件 QWebEngineView - 用于显示网页内容的 widget QWebEnginePage - 表示…

Spring Boot Admin监控

1、概述 Spring Boot Admin 是一款用于监控 Spring Boot 应用程序的开源工具&#xff0c;可帮助开发者实时监控应用的运行状态、性能指标、日志信息等。 2、核心功能 应用状态监控 显示应用是否在线、启动时间、运行时长等基础信息。监控 JVM 相关指标&#xff1a;内存使用情…