计算机视觉中的图像滤波与增强算法

摘要: 本文深入探讨了计算机视觉领域中的图像滤波与增强算法。首先介绍了图像滤波与增强的基本概念和重要性,随后详细阐述了线性滤波算法中的均值滤波和高斯滤波,以及非线性滤波算法中的中值滤波和双边滤波,包括它们的原理、数学模型、算法步骤等。接着探讨了这些算法在不同场景下的应用优势与局限性。最后,分别使用 C# 和 Python 语言实现了高斯滤波和中值滤波算法,并对实现过程进行了详细的注释和说明,通过实际代码展示了这些算法的具体操作流程,旨在为计算机视觉领域的研究人员和开发者提供全面深入的图像滤波与增强算法知识及实用的代码参考。

一、引言

在计算机视觉领域,图像滤波与增强是图像处理的重要基础操作。图像在采集、传输和存储过程中往往会受到各种噪声的干扰,如高斯噪声、椒盐噪声等,同时可能存在对比度不足、细节模糊等问题。图像滤波与增强算法的目的就是去除噪声、改善图像质量、突出图像中的有用信息,从而为后续的图像分析、识别和理解等任务提供更好的基础。例如,在医学图像处理中,清晰的图像有助于医生准确诊断疾病;在计算机视觉的目标检测与识别任务中,高质量的图像输入能显著提高检测与识别的准确率。

二、图像滤波与增强的基本概念

图像滤波是指通过对图像中的每个像素及其邻域进行某种数学运算,从而改变图像的像素值分布,达到去除噪声或提取特定图像特征的目的。图像增强则是对图像进行处理,使其某些特征(如边缘、对比度等)更加明显,或者使图像更适合于特定的应用需求,如人眼观察或后续的计算机处理。

三、线性滤波算法

(一)均值滤波

  1. 原理
    • 均值滤波是一种简单的线性滤波方法。它的基本思想是用邻域内所有像素的平均值来代替当前像素值。对于一个像素点(x,y),其邻域通常是以该点为中心的一个矩形区域(如3x3、5x5等)。
    • 设邻域大小为m x n,邻域内像素值为f(i,j),其中i=x-k,...,x+k ,  j=y-l,...,y+l(),则经过均值滤波后的像素值
  2. 算法步骤
    • 确定邻域大小(如3x3)。
    • 遍历图像中的每个像素。
    • 对于每个像素,获取其邻域内的所有像素值。
    • 计算邻域内像素值的平均值。
    • 将该平均值作为当前像素的新值。

(二)高斯滤波

  1. 原理
    • 高斯滤波是一种基于高斯函数的线性滤波方法。高斯函数具有良好的平滑特性,其二维形式为,其中为标准差,它决定了高斯函数的形状和滤波的程度。
    • 高斯滤波是用邻域内像素值与高斯函数加权求和来得到当前像素的新值。离中心像素越近的像素,其权重越大,这样可以在平滑图像的同时保留图像的边缘等重要信息。
  2. 算法步骤(以离散近似为例)
    • 确定高斯核大小(通常为奇数,如3x3、5x5等)和标准差
    • 根据高斯函数计算高斯核矩阵。例如对于3x3的高斯核,当时=1,高斯核矩阵为:
    • 遍历图像中的每个像素。
    • 对于每个像素,将其邻域内的像素值与高斯核对应元素相乘并求和,得到滤波后的像素值。

四、非线性滤波算法

(一)中值滤波

  1. 原理
    • 中值滤波是一种非线性滤波方法。它的核心思想是用邻域内像素值的中值来代替当前像素值。对于一个像素点(x,y),取其邻域内的所有像素值,将这些值排序后,取中间的值作为该像素的新值。这种方法对于去除椒盐噪声等脉冲噪声非常有效,因为脉冲噪声往往会使像素值偏离邻域内的正常取值范围,而中值滤波可以很好地保留图像的边缘和细节信息,避免了线性滤波对边缘的模糊。
  2. 算法步骤
    • 确定邻域大小(如3x3)。
    • 遍历图像中的每个像素。
    • 对于每个像素,获取其邻域内的所有像素值。
    • 对邻域内像素值进行排序。
    • 取排序后的中值作为当前像素的新值。

(二)双边滤波

  1. 原理
    • 双边滤波是一种非线性的、边缘保持的滤波方法。它同时考虑了空间距离和像素值差异两个因素来确定滤波权重。对于像素点(x,y),其邻域内像素点(i,j)的滤波权重由两部分组成:空间域权重和值域权重,总权重
    • 滤波后的像素值。双边滤波在平滑图像的同时能够很好地保留边缘,因为在边缘处,由于像素值差异较大,值域权重会使边缘像素的影响相对减小,从而避免了边缘被模糊。
  2. 算法步骤
    • 确定邻域大小、空间域标准差和值域标准差
    • 遍历图像中的每个像素。
    • 对于每个像素,计算其邻域内每个像素的空间域权重、值域权重和总权重。
    • 根据总权重对邻域内像素值进行加权求和,得到滤波后的像素值。

五、算法的应用优势与局限性

(一)均值滤波

  1. 优势
    • 算法简单,计算速度快,易于实现。对于均匀分布的噪声有一定的平滑效果。
  2. 局限性
    • 会模糊图像的边缘和细节信息,因为它对邻域内所有像素一视同仁地进行平均处理,在去除噪声的同时也削弱了图像中的高频成分。

(二)高斯滤波

  1. 优势
    • 对图像有较好的平滑效果,相比均值滤波,由于其权重分布符合高斯分布,对边缘的模糊程度相对较小。在处理高斯噪声等符合高斯分布的噪声时效果较好。
  2. 局限性
    • 对于一些非高斯分布的噪声处理效果不佳,且仍然会在一定程度上模糊边缘,尤其是在标准差较大时。

(三)中值滤波

  1. 优势
    • 对于椒盐噪声等脉冲噪声有很好的去除效果,能够有效地保留图像的边缘和细节信息,不会像线性滤波那样模糊边缘。
  2. 局限性
    • 对于高斯噪声等非脉冲噪声的处理效果相对较差,且计算复杂度相对较高,因为需要对邻域内像素值进行排序操作。

(四)双边滤波

  1. 优势
    • 能够在平滑图像的同时很好地保留边缘,在处理图像边缘和细节较多且需要降噪的场景中表现出色,如在图像去噪和图像超分辨率重建等任务中。
  2. 局限性
    • 算法计算复杂度较高,因为需要同时计算空间域和值域的权重,对于大尺寸图像或实时性要求较高的应用场景可能不太适用。

六、高斯滤波算法的 C# 实现

以下是使用 C# 实现高斯滤波的代码示例:

using System;
using System.Drawing;
using System.Drawing.Imaging;

class GaussianFilter
{
    // 计算高斯核
    private static double[,] GenerateGaussianKernel(int size, double sigma)
    {
        double[,] kernel = new double[size, size];
        int center = size / 2;
        double sum = 0;
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                int x = i - center;
                int y = j - center;
                kernel[i, j] = (1.0 / (2 * Math.PI * sigma * sigma)) * Math.Exp(-(x * x + y * y) / (2 * sigma * sigma));
                sum += kernel[i, j];
            }
        }
        // 归一化高斯核
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                kernel[i, j] /= sum;
            }
        }
        return kernel;
    }

    // 高斯滤波函数
    public static Bitmap GaussianFilterImage(Bitmap sourceImage, int kernelSize, double sigma)
    {
        // 获取图像的宽度和高度
        int width = sourceImage.Width;
        int height = sourceImage.Height;
        // 锁定图像的像素数据
        BitmapData sourceData = sourceImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        // 创建目标图像
        Bitmap targetImage = new Bitmap(width, height);
        BitmapData targetData = targetImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
        // 计算高斯核
        double[,] kernel = GenerateGaussianKernel(kernelSize, sigma);
        int center = kernelSize / 2;
        // 遍历图像的每个像素
        unsafe
        {
            byte* sourcePtr = (byte*)sourceData.Scan0.ToPointer();
            byte* targetPtr = (byte*)targetData.Scan0.ToPointer();
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    double red = 0, green = 0, blue = 0;
                    // 对每个像素的邻域与高斯核进行卷积
                    for (int i = -center; i <= center; i++)
                    {
                        for (int j = -center; j <= center; j++)
                        {
                            int xIndex = Math.Max(0, Math.Min(x + i, width - 1));
                            int yIndex = Math.Max(0, Math.Min(y + j, height - 1));
                            int sourceIndex = (yIndex * sourceData.Stride) + (xIndex * 3);
                            red += kernel[i + center, j + center] * sourcePtr[sourceIndex];
                            green += kernel[i + center, j + center] * sourcePtr[sourceIndex + 1];
                            blue += kernel[i + center, j + center] * sourcePtr[sourceIndex + 2];
                        }
                    }
                    // 设置滤波后的像素值
                    int targetIndex = (y * targetData.Stride) + (x * 3);
                    targetPtr[targetIndex] = (byte)Math.Min(255, Math.Max(0, red));
                    targetPtr[targetIndex + 1] = (byte)Math.Min(255, Math.Max(0, green));
                    targetPtr[targetIndex + 2] = (byte)Math.Min(255, Math.Max(0, blue));
                }
            }
        }
        // 解锁图像的像素数据
        sourceImage.UnlockBits(sourceData);
        targetImage.UnlockBits(targetData);
        return targetImage;
    }
}

在上述代码中,GenerateGaussianKernel方法用于根据给定的核大小和标准差计算高斯核矩阵。GaussianFilterImage方法则是对输入的Bitmap图像进行高斯滤波操作。首先锁定源图像和目标图像的像素数据,然后遍历图像的每个像素,对每个像素的邻域与高斯核进行卷积计算,得到滤波后的像素值并设置到目标图像中,最后解锁图像数据并返回滤波后的图像。

七、中值滤波算法的 C# 实现

以下是使用 C# 实现中值滤波的代码示例:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;

class MedianFilter
{
    // 中值滤波函数
    public static Bitmap MedianFilterImage(Bitmap sourceImage, int kernelSize)
    {
        // 获取图像的宽度和高度
        int width = sourceImage.Width;
        int height = sourceImage.Height;
        // 锁定图像的像素数据
        BitmapData sourceData = sourceImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        // 创建目标图像
        Bitmap targetImage = new Bitmap(width, height);
        BitmapData targetData = targetImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
        int center = kernelSize / 2;
        // 遍历图像的每个像素
        unsafe
        {
            byte* sourcePtr = (byte*)sourceData.Scan0.ToPointer();
            byte* targetPtr = (byte*)targetData.Scan0.ToPointer();
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    List<byte> redList = new List<byte>();
                    List<byte> greenList = new List<byte>();
                    List<byte> blueList = new List<byte>();
                    // 收集邻域内的像素值
                    for (int i = -center; i <= center; i++)
                    {
                        for (int j = -center; j <= center; j++)
                        {
                            int xIndex = Math.Max(0, Math.Min(x + i, width - 1));
                            int yIndex = Math.Max(0, Math.Min(y + j, height - 1));
                            int sourceIndex = (yIndex * sourceData.Stride) + (xIndex * 3);
                            redList.Add(sourcePtr[sourceIndex]);
                            greenList.Add(sourcePtr[sourceIndex + 1]);
                            blueList.Add(sourcePtr[sourceIndex + 2]);
                        }
                    }
                    // 对邻域内像素值排序并取中值
                    redList.Sort();
                    greenList.Sort();
                    blueList.Sort();
                    int redMedian = redList[redList.Count / 2];
                    int greenMedian = greenList[greenList.Count / 2];
                    int blueMedian = blueList[blueList.Count / 2];
                    // 设置滤波后的像素值
                    int targetIndex = (y * targetData.Stride) + (x * 3);
                    targetPtr[targetIndex] = (byte)redMedian;
                    targetPtr[targetIndex + 1] = (byte)greenMedian;
                    targetPtr[targetIndex + 2] = (byte)blueMedian;
                }
            }
        }
        // 解锁图像的像素数据
        sourceImage.UnlockBits(sourceData);
        targetImage.UnlockBits(targetData);
        return targetImage;
    }
}

在上述代码中,MedianFilterImage方法对输入的Bitmap图像进行中值滤波操作。首先锁定源图像和目标图像的像素数据,然后遍历图像的每个像素,收集其邻域内的像素值到三个列表(分别对应红、绿、蓝通道),对列表进行排序后取中值作为滤波后的像素值并设置到目标图像中,最后解锁图像数据并返回滤波后的图像。

八、高斯滤波算法的 Python 实现

以下是使用 Python 实现高斯滤波的代码示例:

import cv2
import numpy as np

def generate_gaussian_kernel(size, sigma):
    """
    计算高斯核
    :param size: 高斯核大小
    :param sigma: 标准差
    :return: 高斯核矩阵
    """
    kernel = np.zeros((size, size), dtype=np.float32)
    center = size // 2
    sum = 0
    for i in range(size):
        for j in range(size):
            x = i - center
            y = j - center
            kernel[i, j] = (1.0 / (2 * np.pi * sigma ** 2)) * np.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2))
            sum += kernel[i, j]
    # 归一化高斯核
    kernel /= sum
    return kernel

def gaussian_filter_image(image, kernel_size, sigma):
    """
    对图像进行高斯滤波
    :param image: 输入图像
    :param kernel_size: 高斯核大小
    :param sigma: 标准差
    :return: 滤波后的图像
    """
    # 获取图像的高度、宽度和通道数
    height, width, channels = image.shape
    # 计算高斯核
    kernel = generate_gaussian_kernel(kernel_size, sigma)
    center = kernel_size // 2
    # 创建目标图像
    filtered_image = np.zeros_like(image)
    # 遍历图像的每个像素
    for y in range(height):
        for x in range(width):
            for c in range(channels):
                value = 0
                # 对每个像素的邻域与高斯核进行卷积
                for i in range(-center, center + 1):
                    for j in range(-center, center + 1):
                        x_index = max(0, min(x + i, width - 1))
                        y_index = max(0, min(y + j, height - 1))
                        value += kernel[i + center, j + center] * image[y_index, x_index, c]
                # 设置滤波后的像素值
                filtered_image[y, x, c] = value
    return filtered_image

# 读取图像
image = cv2.imread('test.jpg')
# 进行高斯滤波
filtered_image = gaussian_filter_image(image, 3, 1)
# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述 Python 代码中,generate_gaussian_kernel函数用于生成指定大小和标准差的高斯核矩阵。gaussian_filter_image函数则实现了对输入图像的高斯滤波操作。它首先计算高斯核,然后遍历图像的每个像素及通道,将每个像素邻域与高斯核进行卷积计算,得到滤波后的像素值并存储到目标图像中。最后读取一张图像,对其进行高斯滤波,并显示原始图像和滤波后的图像。

九、中值滤波算法的 Python 实现

import cv2
import numpy as np

def median_filter_image(image, kernel_size):
    """
    对图像进行中值滤波
    :param image: 输入图像
    :param kernel_size: 滤波核大小
    :return: 滤波后的图像
    """
    # 获取图像的高度、宽度和通道数
    height, width, channels = image.shape
    # 创建目标图像
    filtered_image = np.zeros_like(image)
    # 计算滤波核中心位置
    center = kernel_size // 2
    # 遍历图像的每个像素
    for y in range(height):
        for x in range(width):
            for c in range(channels):
                # 收集邻域内的像素值
                values = []
                for i in range(-center, center + 1):
                    for j in range(-center, center + 1):
                        x_index = max(0, min(x + i, width - 1))
                        y_index = max(0, min(y + j, height - 1))
                        values.append(image[y_index, x_index, c])
                # 对邻域内像素值排序并取中值
                values.sort()
                median_index = len(values) // 2
                filtered_image[y, x, c] = values[median_index]
    return filtered_image

# 读取图像
image = cv2.imread('test.jpg')
# 进行中值滤波
filtered_image = median_filter_image(image, 3)
# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段 Python 代码中,median_filter_image函数实现了中值滤波功能。它先创建与输入图像相同大小和类型的目标图像,然后遍历图像的每个像素及通道,收集像素邻域内的所有像素值到一个列表中,对列表排序后取中值作为滤波后的像素值赋给目标图像。最后同样读取图像、进行中值滤波并展示原始图像与滤波后的图像,以便直观地观察中值滤波的效果。通过这些代码示例,可以更深入地理解高斯滤波和中值滤波在 Python 语言中的实现逻辑与实际应用。

十、总结

图像滤波与增强算法在计算机视觉领域起着至关重要的作用。线性滤波算法如均值滤波和高斯滤波在平滑图像方面有各自的特点,均值滤波简单快速但易模糊边缘,高斯滤波平滑效果较好且对边缘相对友好。非线性滤波算法如中值滤波和双边滤波在保留图像细节和边缘方面表现出色,中值滤波对脉冲噪声去除效果佳,双边滤波则能在平滑与边缘保留之间取得较好平衡。通过 C# 和 Python 语言对高斯滤波和中值滤波算法的实现,我们进一步了解了这些算法的具体操作流程和代码实现细节。在实际应用中,需要根据具体的图像特点、噪声类型以及应用需求等因素,选择合适的图像滤波与增强算法,以达到最佳的图像处理效果,为后续的计算机视觉任务如目标检测、图像识别、图像分割等提供高质量的图像数据基础,推动计算机视觉技术在各个领域的深入应用和发展。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型学习笔记|神经网络与注意力机制(逐行解读)

来源分享链接&#xff1a;通过网盘分享的文件&#xff1a;详解神经网络是如何训练的 链接: https://pan.baidu.com/s/12EF7y0vJfH5x6X-0QEVezg 提取码: k924 内容摘要&#xff1a;本文深入探讨了神经网络与注意力机制的基础&#xff0c;以及神经网络参数训练的过程。以鸢尾花数…

腾讯云系统盘扩容

在腾讯云申请空间后&#xff0c;只要执行三行命令 云硬盘 在线扩展系统盘分区及文件系统-操作指南-文档中心-腾讯云 安装工具 yum install -y cloud-utils-growpart 给/eav/vda1扩分区 LC_ALLen_US.UTF-8 growpart /dev/vda 1 挂载扩容 ext4 文件系统 resize2fs /dev/vda1 …

【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

构建树莓派温湿度监测系统:从硬件到软件的完整指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

人工智能系统

介绍人工智能 的基础书 点击这里 1.1 深度学习的历史&#xff0c;现状与发展 本章将介绍深度学习的由来&#xff0c;现状和趋势&#xff0c;让读者能够了解人工智能系统之上的深度学习负载的由来与趋势&#xff0c;为后面理解深度学习系统的设计和权衡形成初步的基础。我们在后…

NVR小程序接入平台EasyNVR设置预置位显示“参数错误”的解决方法

视频监控技术在现代社会中的应用已经变得越来越广泛&#xff0c;从城市安防到家庭安全&#xff0c;从交通管理到商业监控&#xff0c;其作用无处不在。随着科技的不断进步&#xff0c;视频监控不仅提高了安全性&#xff0c;还带来了许多新的机遇和挑战。 近期&#xff0c;我们收…

下载红米Note 9 Pro5G对应的LineageOS代码下载及编译

构建 LineageOS 进入网站&#xff1a;Info about gauguin | LineageOS Wiki&#xff0c;点击&#xff1a;Build for yourself&#xff0c;里面有详细的教程&#xff0c;我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为&#xff1a;20.04.6LinagesOS版本&#xff1a;21-…

如何在 Ubuntu 22.04 上安装 Strapi CMS

简介 Strapi 是一个使用 JavaScript 构建的开源、无头内容管理系统 (CMS)。与其他无头 CMS 一样&#xff0c;Strapi 开箱即用不带前端。它使用 API 作为其前端&#xff0c;允许你使用流行的框架&#xff08;如 React 和 Next.js&#xff09;构建网站。Strapi 基于插件系统&…

Java:集合(List、Map、Set)

文章目录 1. Collection集合1-1. 迭代器遍历方式1-2. 通过for循环进行遍历1-3. forEach遍历 2. List集合2-1. ArrayList底层实现原理2-2. LinkedList底层实现原理 3. Set集合3-1. HashSet 底层实现3-2. LinkedHashSet 底层实现3-3. TreeSet 4. Collection集合->总结5. Map集…

私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?

当云计算席卷而来&#xff0c;基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署&#xff08;On-premises&#xff09;和公有云部署&#xff08;Public Cloud&#xff09;之间&#xff0c;不断融合的混合IT&#xff08;Mixed IT&#xff09;形式成为最常见的企业级…

ElementPlus Table 表格实现可编辑单元格

通过基础的Table表格来实现单元格内容的可编辑 1.首先定位到需要编辑的列&#xff0c;替换el-table-column <el-table-column label"Editable Column" width"300"><template #default"{ row, column, $index }"><el-inputsize&qu…

《数据结构》(408代码题)

2009 单链表&#xff08;双指针&#xff09; 分析&#xff1a;首先呢&#xff0c;给我们的数据结构是一个带有表头结点的单链表&#xff0c;也不允许我们改变链表的结构。链表的长度不是直接给出的啊&#xff0c;所以这个倒数也很棘手。那我们该如何解决这个“k”呢&#xff0c…

Qt控件的盒子模型,了解边距边线和内容区

这篇专门讲讲一个控件在绘制时的视觉样式。我们平常在对控件设置样式时&#xff0c;需要设置控件的一些外边距&#xff0c;内边距&#xff0c;边线&#xff0c;还有文字内容&#xff0c;贴上图片等。那么对于一个控件&#xff0c;到底怎么实现这些设置的呢&#xff1f; 先看下面…

第十二课 Unity 内存优化_内存工具篇(Memory)详解

内存&#xff08;Memory&#xff09; unity 内存部分也是优化过程中非常重要的一个环节&#xff0c;也会影像渲染过程中的同步等待与带宽问题。因此内存的优化也可能会给我们渲染开销带来精简&#xff0c;今天我们先来了解unity中的内存与使用到的内存工具。 Unity中的内存 托…

windows mysql5.7设置慢查询参数

如果没有my.ini,可以复制一份my-default.ini改个名字就可以。 注意重启mysql服务 mysql5.7 直接在配置文件my.ini 中写如下配置 log_slow_admin_statements ON log_slow_slave_statements ON slow_query_log 1 //开启慢查询 &#xff08;很多博客说on off ,我本机my…

STM32F407+LAN8720A +LWIP +FreeRTOS ping通

使用STM32CUBEIDE自带的 LWIP和FreeROTS 版本说明STM32CUBEIDE 操作如下1. 配置RCC/SYS2. 配置ETH/USART3. 配置EHT_RESET/LED4. 配置FreeRTOS5. 配置LWIP6. 配置时钟7. 生成单独的源文件和头文件,并生成代码8. printf重定义9. ethernetif.c添加lan8720a复位10. MY_LWIP_Init …

【电脑技巧】将键盘的方向键映射为alt+i、k、j、l

最近感觉方向键太远了&#xff0c;想找个方法修改键盘映射&#xff0c;有几种方式可以实现 使用powertoys的键盘映射&#xff08;软件太大了&#xff0c;只为键盘映射不值得下这个&#xff09;使用autohotkey&#xff08;通过脚本的方式&#xff0c;可以打包成exe文件&#xf…

物联网中的数据收集:MQTT实现的比较

本篇论文的标题是《Data collection in IoT: A comparison of MQTT implementations》&#xff0c;中文可以翻译为《物联网中的数据收集&#xff1a;MQTT实现的比较》。论文由Erik Gustafsson和Ruben Jarefors撰写&#xff0c;导师是Jalal Maleki&#xff0c;评审员是Rita Kovo…

【开源】使用环信UIKit for uniapp 做一个IM即时聊天应用

环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库&#xff0c;提供各种组件实现会话列表、聊天界面、联系人列表及后续界面等功能&#xff0c;帮助开发者根据实际业务需求快速搭建包含 UI 界面的即时通讯应用。 本文教大家使用环信 uniapp UIKit 快…

人工智能增强的音频和聊天协作服务

论文标题&#xff1a;AI-enabled Audio and Chat Collaboration Services 中文标题&#xff1a;人工智能增强的音频和聊天协作服务 作者信息&#xff1a; Emil P. Andersen, Norwegian Defence Research Establishment (FFI), Kjeller, NorwayJesper R. Goksr, Sindre E. Ha…