7.2 图像复原之空间滤波

news2024/11/14 5:34:40

图像复原(只存在噪声的复原)之空间滤波


文章目录

  • 图像复原(只存在噪声的复原)之空间滤波
  • 前言
  • 1. 均值滤波器
    • 1.1 算术平均滤波器
    • 1.2 几何均值滤波器
    • 1.3 谐波平均滤波器
    • 1.4 反谐波平均滤波器
  • 总结


前言

当一幅图像仅被加性噪声退化时,其退化模型可简化为: g ( x , y ) = f ( x , y ) + η ( x , y ) G ( u , v ) = F ( u , v ) + N ( u , v ) \begin{aligned} &g(x,y)=f(x,y)+\eta(x,y) \\ &G(u,v)=F(u,v)+N(u,v) \end{aligned} g(x,y)=f(x,y)+η(x,y)G(u,v)=F(u,v)+N(u,v)其中: g ( x , y ) [ 或 G ( u , v ) ] 表示退化后的图像 f ( x , y ) [ 或 F ( u , v ) ] 表示原图像 η ( x , y ) [ 或 N ( u , v ) ] 表示图像的噪声 \begin{aligned} &g(x,y)[或G(u,v)]\quad表示退化后的图像\\ &f(x,y)[或F(u,v)]\quad表示原图像 \\ &\eta(x,y)[或N(u,v)]\quad表示图像的噪声\\ \end{aligned} g(x,y)[G(u,v)]表示退化后的图像f(x,y)[F(u,v)]表示原图像η(x,y)[N(u,v)]表示图像的噪声由于噪声项通常是未知的,因此我们 不能 想当然的以为得到原图像的方式为: f ( x , y ) = g ( x , y ) − η ( x , y ) F ( u , v ) = G ( u , v ) − N ( u , v ) \begin{aligned} &f(x,y)=g(x,y)-\eta(x,y) \\ &F(u,v)=G(u,v)-N(u,v) \end{aligned} f(x,y)=g(x,y)η(x,y)F(u,v)=G(u,v)N(u,v)对于只存在加性噪声的图像,可以使用空间滤波的方法来估计 f ( x , y ) f(x,y) f(x,y)

1. 均值滤波器

1.1 算术平均滤波器

算术平均滤波器是最简单的均值滤波器,与空间域滤波中的盒式滤波器完全相同。令: S x y 表示中心为 ( x , y ) 、大小为 m × n 的邻域 S_{xy}表示中心为(x,y)、大小为m\times n的邻域 Sxy表示中心为(x,y)、大小为m×n的邻域则复原的图像 : f ^ ( x , y ) = 1 m n ∑ ( r , c ) ∈ S x y g ( r , c ) \hat{f}(x,y)=\frac {1} {mn}\sum_{(r,c)\in S_{xy}}g(r,c) f^(x,y)=mn1(r,c)Sxyg(r,c)用白话来说就是使用 ( x , y ) (x,y) (x,y) m × n m\times n m×n 邻域的均值作为复原图像的像素值**均值滤波会降低图像的噪声,但是也会模糊图像**。

算术平均滤波器复原图像的代码实现如下

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


def imageRestoration(src, kernel):
    """
    图像复原-算术平均滤波器
    :param src: 需要复原的原图像
    :param kernel: 卷积核
    :return: 返回复原图像
    """
    img = cv.boxFilter(src, -1, kernel)  # cv2.boxFilter 方法 (默认normalize=True)
    return img


if __name__ == '__main__':
    img = cv.imread('Image/Fig0702.tif', 0)

    img1 = imageRestoration(img, (3, 3))
    img2 = imageRestoration(img, (9, 9))
    img3 = imageRestoration(img, (15, 15))

    # 图像显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.size'] = 20
    plt.figure(figsize=(10, 10))
    titleList = ["Original Image", "3*3", "9*9", "15*15"]
    imageList = [img, img1, img2, img3]

    for i in range(4):
        plt.subplot(2, 2, i + 1), plt.title(titleList[i]), plt.axis('off')
        plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
    plt.tight_layout()
    plt.savefig("Image/tmp.png")
    plt.show()

结果分析
在这里插入图片描述
如上图所示:原图像是一张被加性高斯噪声污染的图像,其分别使用3*3、9*9、15*15的算术平均滤波器进行复原处理,可以看出虽然算术平均滤波器可以进行图像复原,但同时也会造成图像模糊

1.2 几何均值滤波器

几何均值滤波器图像复原的公式如下,令:
S x y 表示中心为 ( x , y ) 、大小为 m × n 的邻域 S_{xy}表示中心为(x,y)、大小为m\times n的邻域 Sxy表示中心为(x,y)、大小为m×n的邻域则复原的图像 : f ^ ( x , y ) = [ ∏ ( r , c ) ∈ S x y g ( r , c ) ] 1 m n \hat{f}(x,y)={\left[\prod_{(r,c)\in S_{xy}}g(r,c)\right]}^{\frac{1}{mn}} f^(x,y)= (r,c)Sxyg(r,c) mn1简单来说几何均值就是先求取中心点 ( x , y ) (x,y) (x,y) m × n m\times n m×n 领域的像素之积,然后对像素之积求 1 m n \frac{1}{mn} mn1 次幂。

算术平均滤波器复原图像的代码实现如下

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def ArithmenticMeanFilter(src, kernel):
    """
    图像复原-算数平均滤波器
    :param src: 需要复原的原图像
    :param kernel: 卷积核
    :return: 返回复原图像
    """
    img = cv.boxFilter(src, -1, kernel)  # cv2.boxFilter 方法 (默认normalize=True)
    return img


def GeometricMeanFilter(src, kernel):
    """
    图像复原-几何平均滤波器
    :param src: 原图像
    :param kernel: 卷积核的大小
    :return:
    """

    # 将图像转换为浮点数,以避免计算过程中出现溢出
    src = src.astype(np.float32) + 1e-10  # 防止取对数时出现零
    rows, cols = src.shape # 图像的大小

    # 进行几何平均值计算时,边缘像素会无法处理,因此需要对边缘像素进行填充
    pad_size = kernel // 2  # 边缘填充的大小
    padded_image = np.pad(src, pad_size, mode='reflect')  # 对边缘进行填充

    # 遍历图像每个像素,并计算几何均值
    output = np.zeros_like(src)
    for i in range(rows):
        for j in range(cols):
            # 获取邻域
            region = padded_image[i:i + kernel, j:j + kernel]
            # 计算邻域内像素的几何均值
            mean = np.exp(np.mean(np.log(region)))
            output[i, j] = mean

    # 计算出来的结果是浮点数,需要将浮点数转换为8位整数
    output = np.clip(output, 0, 255).astype(np.uint8)
    return output

if __name__ == '__main__':
    img = cv.imread('Image/Fig0702.tif', 0)

    img1 = ArithmenticMeanFilter(img, (3, 3))
    img2 = GeometricMeanFilter(img, 3)
    img3 = ArithmenticMeanFilter(img, (9, 9))
    img4 = GeometricMeanFilter(img, 9)

    # 图像显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.size'] = 20
    plt.figure(figsize=(30, 20))
    titleList = ["Original Image", "Arithmentic Mean Filter 3*3", "Geometric Mean Filter 3*3", "Original Image", "Arithmentic Mean Filter 9*9", "Geometric Mean Filter 9*9"]
    imageList = [img, img1, img2, img, img3, img4]

    for i in range(6):
        plt.subplot(2, 3, i + 1), plt.title(titleList[i]), plt.axis('off')
        plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
    plt.tight_layout()
    plt.savefig("Image/tmp.png")
    plt.show()

结果分析
在这里插入图片描述
如上图所示:原图像依旧是那张被加性高斯噪声污染的图像,其分别使用算术平均滤波器和几何平均滤波器进行复原处理,可以看出这两种滤波器都可以进行降噪处理,但是几何平均滤波器对图像的模糊效果要少一些,特别是当卷积核大的时候更加明显

1.3 谐波平均滤波器

谐波平均滤波器图像复原的公式如下,令:
S x y 表示中心为 ( x , y ) 、大小为 m × n 的邻域 S_{xy}表示中心为(x,y)、大小为m\times n的邻域 Sxy表示中心为(x,y)、大小为m×n的邻域则复原的图像 : f ^ ( x , y ) = m n ∑ ( r , c ) ∈ S x y 1 g ( r , c ) \hat{f}(x,y)=\frac{mn}{\sum_{(r,c)\in S_{xy}}\frac{1}{g(r,c)}} f^(x,y)=(r,c)Sxyg(r,c)1mn简单解释一下。

  • 第一步:用 1 1 1 除以领域内每个像素的值,即 1 g ( r , c ) \frac{1}{g(r,c)} g(r,c)1
  • 第二步:对第一步的结果求和,即 ∑ ( r , c ) ∈ S x y 1 g ( r , c ) \sum_{(r,c)\in S_{xy}} \frac{1}{g(r,c)} (r,c)Sxyg(r,c)1
  • 第三步:用 m n mn mn 除以第二步的结果。

谐波平均滤波器复原图像的代码实现如下

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


def ArithmenticMeanFilter(src, kernel):
    """
    图像复原-算数平均滤波器
    :param src: 需要复原的原图像
    :param kernel: 卷积核
    :return: 返回复原图像
    """
    img = cv.boxFilter(src, -1, kernel)  # cv2.boxFilter 方法 (默认normalize=True)
    return img


def GeometricMeanFilter(src, kernel):
    """
    图像复原-几何平均滤波器
    :param src: 原图像
    :param kernel: 卷积核的大小
    :return:
    """

    # 将图像转换为浮点数,以避免计算过程中出现溢出
    src = src.astype(np.float32) + 1e-10  # 防止取对数时出现零
    rows, cols = src.shape  # 图像的大小

    # 进行几何平均值计算时,边缘像素会无法处理,因此需要对边缘像素进行填充
    pad_size = kernel // 2  # 边缘填充的大小
    padded_image = np.pad(src, pad_size, mode='reflect')  # 对边缘进行填充

    # 遍历图像每个像素,并计算几何均值
    output = np.zeros_like(src)
    for i in range(rows):
        for j in range(cols):
            # 获取邻域
            region = padded_image[i:i + kernel, j:j + kernel]
            # 计算邻域内像素的几何均值
            mean = np.exp(np.mean(np.log(region)))
            output[i, j] = mean

    # 计算出来的结果是浮点数,需要将浮点数转换为8位整数
    output = np.clip(output, 0, 255).astype(np.uint8)
    return output


def HarmonicMeanFilter(src, kernel):
    """
    图像复原-谐波平均滤波器
    :param src: 原图像
    :param kernel: 卷积核的大小
    :return:
    """

    # 将图像转换为浮点数,以避免计算过程中出现溢出
    src = src.astype(np.float32) + 1e-10  # 防止取对数时出现零
    rows, cols = src.shape  # 图像的大小

    # 进行几何平均值计算时,边缘像素会无法处理,因此需要对边缘像素进行填充
    pad_size = kernel // 2  # 边缘填充的大小
    padded_image = np.pad(src, pad_size, mode='reflect')  # 对边缘进行填充

    # 遍历图像每个像素,并计算几何均值
    output = np.zeros_like(src)
    for i in range(rows):
        for j in range(cols):
            # 获取邻域
            region = padded_image[i:i + kernel, j:j + kernel]
            # 计算邻域内像素的几何均值
            mean = (kernel * kernel) / np.sum(1.0 / (region + 1e-10))  # 加上小值避免除零
            output[i, j] = mean

    # 计算出来的结果是浮点数,需要将浮点数转换为8位整数
    output = np.clip(output, 0, 255).astype(np.uint8)
    return output


if __name__ == '__main__':
    img = cv.imread('Image/Fig0702.tif', 0)

    img1 = ArithmenticMeanFilter(img, (3, 3))
    img2 = GeometricMeanFilter(img, 3)
    img3 = HarmonicMeanFilter(img, 3)

    # 图像显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.size'] = 20
    plt.figure(figsize=(20, 20))
    titleList = ["Original Image", "Arithmentic Mean Filter 3*3", "Geometric Mean Filter 3*3",
                 "Harmonic Mean Filter 3*3"]
    imageList = [img, img1, img2, img3]

    for i in range(4):
        plt.subplot(2, 2, i + 1), plt.title(titleList[i]), plt.axis('off')
        plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
    plt.tight_layout()
    plt.savefig("Image/tmp.png")
    plt.show()

结果分析
在这里插入图片描述
如上图所示:原图像依旧是那张被加性高斯噪声污染的图像,其分别使用算术平均滤波器、几何平均滤波器和谐波平均滤波器进行复原处理,可以看出这三种滤波器都可以对高斯噪声进行降噪处理

1.4 反谐波平均滤波器

谐波平均滤波器图像复原的公式如下,令:
S x y 表示中心为 ( x , y ) 、大小为 m × n 的邻域 S_{xy}表示中心为(x,y)、大小为m\times n的邻域 Sxy表示中心为(x,y)、大小为m×n的邻域则复原的图像 : f ^ ( x , y ) = ∑ ( r , c ) ∈ S x y g ( r , c ) Q + 1 ∑ ( r , c ) ∈ S x y g ( r , c ) Q \hat{f}(x,y)=\frac{\sum_{(r,c)\in S_{xy}}g(r,c)^{Q+1}}{\sum_{(r,c)\in S_{xy}}g(r,c)^{Q}} f^(x,y)=(r,c)Sxyg(r,c)Q(r,c)Sxyg(r,c)Q+1简单解释一下,式中:

  • Q Q Q 称为滤波器的阶数,这种滤波器适用于降低或消除噪声 。
  • Q Q Q 为正值时,该滤波器消除胡椒噪声。
  • Q Q Q 为负值时,该滤波器消除盐粒噪声。
  • 然而,该滤波器不能同时消除这两种噪声。
  • Q = 0 Q=0 Q=0 时,反谐波平均滤波器简化为算数平均滤波器。
  • Q = − 1 Q=-1 Q=1时,反谐波平均滤波器简化为谐波平均滤波器。

反谐波平均滤波器复原图像的代码实现如下

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


def Inv_HarmonicMeanFilter(src, kernel, Q):
    """
    图像复原-反谐波平均滤波器
    :param src: 原图像
    :param kernel: 卷积核的大小
    :param Q: 滤波器的阶数
    :return:
    """

    # 将图像转换为浮点数,以避免计算过程中出现溢出
    src = src.astype(np.float32) + 1e-10  # 防止取对数时出现零
    rows, cols = src.shape  # 图像的大小

    # 进行几何平均值计算时,边缘像素会无法处理,因此需要对边缘像素进行填充
    pad_size = kernel // 2  # 边缘填充的大小
    padded_image = np.pad(src, pad_size, mode='reflect')  # 对边缘进行填充

    # 遍历图像每个像素,并计算几何均值
    output = np.zeros_like(src)
    for i in range(rows):
        for j in range(cols):
            # 获取邻域
            region = padded_image[i:i + kernel, j:j + kernel]
            # 计算分子和分母
            numerator = np.sum(np.power(region, Q + 1))
            denominator = np.sum(np.power(region, Q) + 1e-10)  # 加小值避免除零
            # 计算反谐波均值
            output[i, j] = numerator / denominator

    # 计算出来的结果是浮点数,需要将浮点数转换为8位整数
    output = np.clip(output, 0, 255).astype(np.uint8)
    return output


if __name__ == '__main__':
    pepperImg = cv.imread('Image/Fig0703.tif', 0)  # 胡椒噪声图像
    saltImage = cv.imread('Image/Fig0704.tif', 0)  # 盐粒噪声图像

    img1 = Inv_HarmonicMeanFilter(pepperImg, 3, 1.5)
    img2 = Inv_HarmonicMeanFilter(saltImage, 3, -1.5)

    # 当阶数取反,则会出现灾难性后果
    img3 = Inv_HarmonicMeanFilter(pepperImg, 3, -1.5)
    img4 = Inv_HarmonicMeanFilter(saltImage, 3, 1.5)

    # 图像显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.size'] = 20
    plt.figure(figsize=(20, 30))
    titleList = ["Original Pepper Image", "Original Salt Image", "Inv_Harmonic Mean Filter Q = 1.5",
                 "Inv_Harmonic Mean Filter Q = -1.5", "Q = -1.5", "Q = 1.5"]
    imageList = [pepperImg, saltImage, img1, img2, img3, img4]

    for i in range(6):
        plt.subplot(3, 2, i + 1), plt.title(titleList[i]), plt.axis('off')
        plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
    plt.tight_layout()
    plt.savefig("Image/tmp.png")
    plt.show()

结果分析
在这里插入图片描述
上图中第一和第二张图像分别是胡椒噪声图像和盐粒噪声图像,接下来使用了反谐波平均滤波器对图像进行了复原处理,可以看出效果相当不错,但是反谐波平均滤波器有一个缺点,就是必须要提前知道是胡椒噪声还是盐粒噪声,否则会出现上面第五、第六张图像的问题


总结

滤波器类型定义适用噪声类型对噪声的处理效果保留图像细节的能力
算术平均滤波器对邻域内像素值求算术平均高斯噪声对高斯噪声效果较好易模糊边缘细节
几何平均滤波器对邻域内像素值求几何平均乘性噪声、对数噪声对高斯噪声效果一般能保留更多细节
谐波平均滤波器对邻域内像素值求倒数平均盐噪声(高亮噪声)抑制盐噪声效果好边缘保留较好
反谐波平均滤波器根据参数 Q Q Q 有选择性地去噪椒盐噪声(混合噪声)盐噪声或椒噪声(依赖 Q Q Q 值)灵活去噪能力强

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

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

相关文章

化工防爆巡检机器人:在挑战中成长,为化工安全保驾护航

随着全球能源需求的不断攀升,化工行业的安全性与高效性愈发受到关注。化工设施规模巨大,而且其中多数存在高风险因素,像是易燃易爆化学物质、高温环境、有毒有害物质以及高压设备等。仅2023年,国内危化品事故就多达652起&#xff…

【数字图像处理+MATLAB】对图片进行伽马校正(Gamma Correction):使用幂律变换公式进行伽马变换

引言 伽马校正(Gamma Correction)是一种用于图像处理的技术,主要用于调整图像的亮度或对比度。其基本原理是对图像的每一个像素应用一个非线性变换,以更好地适应人眼的视觉感知。在数字图像处理中,伽马校正通常用于调…

scala 迭代更新

在Scala中,迭代器(Iterator)是一种用于遍历集合(如数组、列表、集合等)的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素,而无需关心集合的具体实现。 在Scala中&#xff0c…

部署zabbix遇到问题: cannot find a valid baseurl for repo:centos-sclo-rh/x86 64 怎么解决 ?

安装 Zabbix 前端包,提示cannot find a valid baseurl for repo:centos-sclo-rh/x86 64 安装zabbix前端包 # yum install zabbix-web-mysql-scl zabbix-apache-conf-scl 解决办法: 原因是:CentOS7的SCL源在2024年6月30日停止维护…

SpringBoot(十九)创建多模块Springboot项目(完整版)

之前我有记录过一次SpringBoot多模块项目的搭建,但是那一次只是做了一个小小的测试。只是把各模块联通之后就结束了。 最近要增加业务开发,要将目前的单模块项目改成多模块项目,我就参照了一下我上次搭建的流程,发现总是有报错。上次搭建的比较顺利,很多细枝末节也没有仔细…

基于Python的智能无人超市管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

什么是量化交易

课程大纲 内容初级初识量化,理解量化 初识量化 传统量化和AI量化的区别 量化思想挖掘 量化思想的挖掘及积累技巧 量化代码基础: python、pandas、SQL基础语法 金融数据分析 常用金融分析方式 常用因子分析方式 数据分析实战练习 回测及交易引擎 交易引擎…

xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer

打开 .sh 文件所在的终端窗口,执行终端命令:sh 文件名.sh,出现如下错误: 解决办法:

PETR/PETRv2/StreamPETR论文阅读

1. PETR PETR网络结构如下,主要包括image-backbone,3D Coordinates Generator,3D Position Encoder,transformer Decoder四个模块。 把N 个视角的图像输入到骨干网络中以提取 2D 多视图特征。在 3D 坐标生成器中,首先…

除了 Postman,还有什么好用的 API 调试工具吗

尽管 Postman 拥有团队协作等实用特性,其免费版提供的功能相对有限,而付费版的定价可能对小团队或个人开发者而言显得偏高。此外,Postman 的访问速度有时较慢,这可能严重影响使用体验。 鉴于这些限制,Apifox 成为了一…

程序员做自媒体,你所不了解的提词器,原来还有这么多大用处

程序猿的出路,不只是外卖员! 你或许以为提词器只是个“背词神器”?实际上,它的应用范围早已超出你的想象。从直播到会议,从视频拍摄到户外采访,每一种场景都有对应的提词神器,帮你提升效率、避…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

JS 实现WebSocket通讯和什么是WebSocket

WebSocket 介绍: WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信。它允许服务器主动向客户端推送信息,客户端也能实时接收服务器的响应。 客户端 这里实现了将input内的内容发送给客户端,并将接收到的服务器的…

前端 JS面向对象 继承

目录 一、ES5通过prototype来继承 二、ES6 class实现 一、ES5通过prototype来继承 const Person{eyes:2,head:1}function Woman(){}Woman.prototypePersonconst ladynew Woman()console.log(lady)function Man(){}Man.prototypePersonconst mannew Man()console.log(man) 打…

三菱FX5UPLC以太网Socket通信功能Passive开放的程序示例

Passive开放的通信流程如下所示。 参数设置 示例程序中使用的参数设置如下所示。 [CPU模块】 导航窗口↔[参数]↔[模块型号]↔[模块参数]-[以太网端口]-[基本设置]-[对象设备连接配置设置]↔[详细设置]→[以太网配置(内置以太网端口)]画面 【以太网模块】 [导航]中「参数]→[模…

UniApp 应用、页面与组件的生命周期详解

UniApp 应用、页面与组件的生命周期详解 在uni-app中包含了 应用生命周期、页面生命周期、和组件生命周期&#xff08; Vue.js的&#xff09;函数。 应用生命周期 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 <script>export default {onLaunc…

Optimism掀起发链热潮,还有哪些发链 平台值得关注?

继电子巨头索尼在OP上发布L2 Soneium之后&#xff0c;10月29日&#xff0c;再质押协议巨头Swell宣布迁移至Optimism超级链&#xff0c;通过OP Stack构建Rollup加入OP生态系统。据DeFilama数据显示&#xff0c;Swell的TVL最高曾超过30亿美元&#xff0c;目前为13.4亿美元&#x…

0. 0:《跟着小王学Python·新手》

《跟着小王学Python新手》系列 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的核心概念。通过开发游戏、构…

如何优化Kafka消费者的性能

要优化 Kafka 消费者性能&#xff0c;你可以考虑以下策略&#xff1a; 并行消费&#xff1a;通过增加消费者组中的消费者数量来并行处理更多的消息&#xff0c;从而提升消费速度。 批量消费&#xff1a;配置 fetch.min.bytes 和 fetch.max.wait.ms 参数来控制批量消费的大小和…

Golang | Leetcode Golang题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; func nextGreaterElement(n int) int {x, cnt : n, 1for ; x > 10 && x/10%10 > x%10; x / 10 {cnt}x / 10if x 0 {return -1}targetDigit : x % 10x2, cnt2 : n, 0for ; x2%10 < targetDigit; x2 / 10 {cnt2}x x2%10 -…