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

低通滤波器和高通滤波器

应用于图像低通滤波器和高通滤波器的实现

需要用到傅里叶变换


#include <opencv2/opencv.hpp>
#include <Eigen>
#include <iostream>
#include <vector>
#include <cmath>
#include <complex>#define M_PI       3.14159265358979323846   // pi
// 对数幅度缩放
Eigen::MatrixXd logAmplitudeSpectrum(const Eigen::MatrixXd& spectrum) {return (spectrum.array() + 1).log();
}//  乘幂尺度变换
Eigen::MatrixXd powerLawScaling(const Eigen::MatrixXd& spectrum, double gamma) {return spectrum.array().pow(gamma);
}// 归一化 to [0, 1]
Eigen::MatrixXd normalize(const Eigen::MatrixXd& spectrum) {double minVal = spectrum.minCoeff();double maxVal = spectrum.maxCoeff();return (spectrum.array() - minVal) / (maxVal - minVal);
}// 增强频谱显示
Eigen::MatrixXd enhanceSpectrumDisplay(const Eigen::MatrixXd& spectrum, double gamma = 1) {Eigen::MatrixXd logSpectrum = logAmplitudeSpectrum(spectrum);Eigen::MatrixXd powerScaledSpectrum = powerLawScaling(logSpectrum, gamma);return normalize(powerScaledSpectrum);
}// 从复数矩阵中获取幅度谱和相位谱
void getAmplitudeAndPhaseSpectra(const Eigen::MatrixXcd& data, Eigen::MatrixXd& amplitude, Eigen::MatrixXd& phase) {amplitude = data.array().abs().matrix();phase = data.array().arg().matrix();
}// 从幅度谱和相位谱重构复数矩阵
void reconstructFromAmplitudeAndPhase(const Eigen::MatrixXd& amplitude,const Eigen::MatrixXd& phase,Eigen::MatrixXcd& data)
{data = (amplitude.array() * (phase.array().cos() + std::complex<double>(0, 1) * phase.array().sin())).matrix();}// 1:**振幅谱低频移动到中心(频率平移)**:方便操作,利用象限对称互换 fft之后
Eigen::MatrixXd fftShift(const Eigen::MatrixXd &F)
{int M = F.rows();int N = F.cols();Eigen::MatrixXd F_shifted(M, N);int mid_M = M >> 1;int mid_N = N >> 1;// 交换第一象限和第三象限F_shifted.block(0, 0, mid_M, mid_N) = F.block(mid_M, mid_N, mid_M, mid_N);F_shifted.block(mid_M, mid_N, mid_M, mid_N) = F.block(0, 0, mid_M, mid_N);// 交换第二象限和第四象限F_shifted.block(0, mid_N, mid_M, mid_N) = F.block(mid_M, 0, mid_M, mid_N);F_shifted.block(mid_M, 0, mid_M, mid_N) = F.block(0, mid_N, mid_M, mid_N);return F_shifted;
}// 2:振幅谱低频移动到中心  **图像进行-1幂操作**:然后经过fft变换后,低频会在振幅谱中间 fft之前
Eigen::MatrixXd imageShift(const Eigen::MatrixXd &image)
{int M = image.rows();int N = image.cols();Eigen::MatrixXd F_shifted(M, N);// 通过乘以 (-1)^(u+v) 来平移频率for (int u = 0; u < M; ++u){for (int v = 0; v < N; ++v){//(u + v) & 1 通过位的判断末尾如果是1 为奇数,为0,为偶数。 -1的奇次幂还是-1,偶次幂为1.F_shifted(u, v) = image(u, v) * ((u + v) & 1 ? -1 : 1);}}return F_shifted;
}Eigen::MatrixXd tMatrixXd(const cv::Mat &img)
{Eigen::MatrixXd image(img.rows, img.cols);for (int i = 0; i < img.rows; ++i){for (int j = 0; j < img.cols; ++j){image(i, j) = img.at<float>(i, j);}}return image;
}
cv::Mat tMat(const Eigen::MatrixXd &img)
{cv::Mat image(img.rows(), img.cols(), CV_32FC1);for (int i = 0; i < img.rows(); ++i){for (int j = 0; j < img.cols(); ++j){image.at<float>(i, j) = img(i, j);}}return image;
}//inv =true 为逆变换,false为 正变换
//FFT 使用Eigen库中的向量表示,方便二维计算
Eigen::VectorXcd FFT(const Eigen::VectorXcd& y, bool inv = false)
{Eigen::VectorXcd x = y;//数据的大小int N = x.size();// 按位反转for (int i = 1, j = 0; i < N; i++){//bit = N/2int bit = N >> 1;/** 我们正在查看j的二进制表示中的每一位。从左到右,我们检查每一位是否为1。对于每一个为1的位,我们将其反转为0。当我们遇到第一个为0的位时,循环终止。*/for (; j & bit; bit >>= 1){j ^= bit;}//进行异或运算(XOR运算的工作原理是:当两个比较的位相同时,结果是0;当两个比较的位不同时,结果是1。)j ^= bit;//当 i >j 表示前面已经替换了位置, i==j,表示位置不用变if (i < j){std::swap(x[i], x[j]);}}// 预先计算旋转因子Eigen::VectorXcd w(N >> 1);//逆变换 = 1;傅里叶变换  = -1;double imag_i = inv ? 1.0 : -1.0;std::complex<double> tempW = std::exp(std::complex<double>(0, imag_i * 2 * M_PI / N));w[0] = 1;for (int i = 1; i < (N >> 1); ++i){// w[i] = std::polar(1.0, imag_i * 2 * M_PI * i / N);//w[i] = std::pow(tempW, i);w[i] = w[i - 1] * tempW;}// 迭代FFTfor (int len = 2; len <= N; len <<= 1){int halfLen = len >> 1;int step = N / len;for (int i = 0; i < N; i += len){for (int j = 0; j < halfLen; ++j){std::complex<double> u = x[i + j];std::complex<double> v = x[i + j + halfLen] * w[j * step];x[i + j] = u + v;x[i + j + halfLen] = u - v;}}}//使用逆变换时if (inv){for (std::complex<double>& a : x) {a /= N;}}return x;
}//检查二维数据大小是否为2的幂数,不是则填充为0到2的幂数大小
Eigen::MatrixXd padToPowerOfTwo(const Eigen::MatrixXd& matrix) {int rows = matrix.rows();int cols = matrix.cols();// 确保输入的大小是2的幂int newRows = 1, newCols = 1;while (newRows < rows){newRows <<= 1;}while (newCols < cols){newCols <<= 1;}Eigen::MatrixXd paddedMatrix = Eigen::MatrixXd::Zero(newRows, newCols);paddedMatrix.block(0, 0, rows, cols) = matrix;return paddedMatrix;
}
// 离散傅里叶变换 -  二维
Eigen::MatrixXcd FFT2D(const Eigen::MatrixXcd& image, bool inv = false) {int rows = image.rows();int cols = image.cols();Eigen::MatrixXcd result(rows, cols);for (int i = 0; i < rows; i++) {Eigen::VectorXcd temp = image.row(i).transpose();result.row(i) = FFT(temp, inv);}for (int j = 0; j < cols; j++) {Eigen::VectorXcd temp = result.col(j);result.col(j) = FFT(temp, inv);}return result;
}//创建高频  radius越小,越减少高频的部分,越大,越还原图像
Eigen::MatrixXd highFrequency (const Eigen::MatrixXd & data,int radius)
{int rows = data.rows();int cols = data.cols();// 创建高通滤波器(圆形掩码)Eigen::MatrixXd mask = Eigen::MatrixXd::Ones(rows, cols);//中心坐标int centerRow = rows >> 1;int centerCol = cols >> 1;//找到以 radius 大小的矩形范围内//左边位置int left = centerCol - radius;//超过边界 为0left = left > 0 ? left : 0;//右边位置int right = centerCol + radius;//超过边界 为0right = right < cols ? right : cols;//上边位置int top = centerRow - radius;//超过边界 为0top = top > 0 ? top : 0;//下边位置int down = centerRow + radius;//超过边界 为0down = down < rows ? down : rows;//在正矩形内画最大的圆for (int i = top; i < down; ++i){for (int j = left; j < right; ++j){//在图像中心画圆,半径不能超过double distance = std::sqrt(std::pow(i - centerRow, 2) + std::pow(j - centerCol, 2));if (distance <= radius){mask(i, j) = 0.0;}}}return mask;}
//创建高通滤波器 -
//简单的说,就是靠近频谱图中心的低频部分给舍弃掉,远离频谱图中心的高频部分保留。通常会保留物体的边界。
Eigen::MatrixXd  highPassFilter(const Eigen::MatrixXd & image, int radius = 0)
{int rows = image.rows();int cols = image.cols();//大小变为2的幂数Eigen::MatrixXd data = padToPowerOfTwo(image);// 计算傅里叶变换Eigen::MatrixXcd transformed = FFT2D(data);//获取幅度谱和相位谱Eigen::MatrixXd amplitude, phase;getAmplitudeAndPhaseSpectra(transformed, amplitude, phase);//振幅谱移动到中心(频率平移)amplitude = fftShift(amplitude);/////增强振幅,用于观测 --  实际运算注释掉Eigen::MatrixXd amplitude1 = enhanceSpectrumDisplay(amplitude,1);cv::Mat highP = tMat(amplitude1);cv::imshow("highPassFilter",highP);/////根据radius创建高频掩码Eigen::MatrixXd mask = highFrequency(amplitude, radius);amplitude = amplitude.array() * mask.array();//振幅谱移动到中心(频率平移)反转换amplitude = fftShift(amplitude);// 从幅度谱和相位谱重构复数矩阵reconstructFromAmplitudeAndPhase(amplitude, phase, transformed);// 计算逆变换Eigen::MatrixXcd reconstructed = FFT2D(transformed, true);return reconstructed.real().block(0, 0, rows, cols);
}
//创建低频  radius越小,越还原图像,越大,减少低频的部分,
Eigen::MatrixXd lowFrequency(const Eigen::MatrixXd & data,int radius)
{int rows = data.rows();int cols = data.cols();// 创建低通滤波器(圆形掩码)Eigen::MatrixXd mask = Eigen::MatrixXd::Zero(rows, cols);//中心坐标int centerRow = rows >> 1;int centerCol = cols >> 1;//找到以 radius 大小的矩形范围内//左边位置int left = centerCol - radius;//超过边界 为0left = left > 0 ? left : 0;//右边位置int right = centerCol + radius;//超过边界 为0right = right < cols ? right : cols;//上边位置int top = centerRow - radius;//超过边界 为0top = top > 0 ? top : 0;//下边位置int down = centerRow + radius;//超过边界 为0down = down < rows ? down : rows;//在正矩形内画最大的圆for (int i = top; i < down; ++i){for (int j = left; j < right; ++j){//在图像中心画圆,半径不能超过double distance = std::sqrt(std::pow(i - centerRow, 2) + std::pow(j - centerCol, 2));if (distance <= radius){mask(i, j) = 1.0;}}}return mask;}
//创建低通滤波器 -
//简单的说,就是靠近频谱图中心的低频部分给保留,远离频谱图中心的高频部分给去除掉。但是这会影响图像的清晰度。
Eigen::MatrixXd  lowPassFilter(const Eigen::MatrixXd & image, int radius = 0)
{int rows = image.rows();int cols = image.cols();//大小变为2的幂数Eigen::MatrixXd data = padToPowerOfTwo(image);// 计算傅里叶变换Eigen::MatrixXcd transformed = FFT2D(data);//获取幅度谱和相位谱Eigen::MatrixXd amplitude, phase;getAmplitudeAndPhaseSpectra(transformed, amplitude, phase);//振幅谱移动到中心(频率平移)amplitude = fftShift(amplitude);///
//    //增强振幅,用于观测 --  实际运算注释掉
//    Eigen::MatrixXd amplitude1 = enhanceSpectrumDisplay(amplitude,1);
//    cv::Mat highP = tMat(amplitude1);
//    cv::imshow("lowPassFilter",highP);/////根据radius创建高频掩码Eigen::MatrixXd mask = lowFrequency(amplitude, radius);amplitude = amplitude.array() * mask.array();//振幅谱移动到中心(频率平移)反转换amplitude = fftShift(amplitude);// 从幅度谱和相位谱重构复数矩阵reconstructFromAmplitudeAndPhase(amplitude, phase, transformed);// 计算逆变换Eigen::MatrixXcd reconstructed = FFT2D(transformed, true);return reconstructed.real().block(0, 0, rows, cols);
}int main()
{cv::Mat img = cv::imread("193560523230866.png");if (img.empty()){std::cout << "请确定是否输入正确的图像文件" << std::endl;}cv::Mat gray;cvtColor(img, gray, cv::COLOR_BGR2GRAY);//图像转换CV_32F储存gray.convertTo(gray, CV_32F, 1 / 255.0, 0);//图像太大,用直接计算 耗时太长,缩小比例//resize(gray, gray, cv::Size(80, 80));//Mat  转 MatrixXdEigen::MatrixXd image = tMatrixXd(gray);// 记录开始时间auto start = std::chrono::high_resolution_clock::now();//低频Eigen::MatrixXd low = lowPassFilter(image,50);//高频Eigen::MatrixXd high = highPassFilter(image, 50);// 记录结束时间auto stop = std::chrono::high_resolution_clock::now();// 计算持续时间auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);qDebug() << "代码运行时长: " << duration.count() << " 微秒" ;cv::Mat lowP = tMat(low);//+0.5 增加显示效果high = high.array() + 0.5;cv::Mat highP = tMat(high);cv::imshow("lowP",lowP);cv::imshow("highP",highP);return 0;
}

在这里插入图片描述

在这里插入图片描述

  • 振幅增强
    在这里插入图片描述
    在这里插入图片描述

相关文章:

低通滤波器和高通滤波器

应用于图像低通滤波器和高通滤波器的实现 需要用到傅里叶变换 #include <opencv2/opencv.hpp> #include <Eigen> #include <iostream> #include <vector> #include <cmath> #include <complex>#define M_PI 3.14159265358979323846…...

VS中插入Qt插件后配置项目笔记

Project下要创建四个文件夹: bin(输出目录\工作目录) 、include(头文件目录) 、lib(动态库目录) 、src(源码目录) 一、主项目模块配置&#xff1a; 1.配置属性——>常规——>输出目录加入(..\..\bin\) 2.配置属性——>调试——>工作目录加入($(OutDir)) 备注&am…...

Hugo·Stack主题·使用及修改

代码折叠 cp themes/hugo折-themt-saick/exampleSlte/config.yamsclass"codefold"><summary class"codefold__title"><span class"codefold__title-text">" {{ with .Get 0}}{{.}}{{else}}click to expand{{ end }} "&…...

实战:大数据Spark简介与docker-compose搭建独立集群

文章目录 前言技术积累Spark简介Spark核心功能及优势Spark运行架构 Spark独立集群搭建安装docker和docker-composedocker-compose编排docker-compose编排并运行容器 Spark集群官方案例测试写在最后 前言 很多同学都使用过经典的大数据分布式计算框架hadoop&#xff0c;其分布式…...

嵌入性视角下的企业集成创新网络演化过程

从嵌入性角度来看&#xff0c;集成创新网络以社会关系嵌入或结构嵌入的联结方式&#xff0c;实 现创新资源共享。由于规模经济和能力的差异&#xff0c;较高的信息复杂程度往往更强调网 络化和外部组织之间的联合而不是一体化。企业集成创新网络依靠创新网络结点上 企业的合…...

回归预测 | MATLAB实现FA-ELM萤火虫算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现FA-ELM萤火虫算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现FA-ELM萤火虫算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍…...

数据结构数组栈的实现

Hello&#xff0c;今天我们来实现一下数组栈&#xff0c;学完这个我们又更进一步了。 一、栈 栈的概念 栈是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据的插入和删除只在栈顶实现&#xff0c;另一端就是栈底。 栈的元素是后进先出。…...

成集云 | 抖店连接器客户静默下单催付数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着各品牌全渠道铺货&#xff0c;主播在平台上直播时客户下了订单后不能及时付款&#xff0c;第一时间客户收不到提醒&#xff0c;不仅造成了客户付款率下降&#xff0c;更大量消耗了企业的人力成本和经济。而成集云与钉钉深度合作&#xff0…...

【算法专题突破】双指针 - 复写零(2)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;1089. 复写零 - 力扣&#xff08;Leetcode&#xff09; 我先来读题&#xff0c; 题目的意思非常的简单&#xff0c;其实就是&#xff0c; 遇到 0 就复制一个写进数组&a…...

【Java从0到1学习】11 Java集合框架

1. Collection 1.1 Java类中集合的关系图 1.2 集合类概述 在程序中可以通过数组来保存多个对象&#xff0c;但在某些情况下开发人员无法预先确定需要保存对象的个数&#xff0c;此时数组将不再适用&#xff0c;因为数组的长度不可变。例如&#xff0c;要保存一个学校的学生信…...

uniapp使用uni.chooseLocation()打开地图选择位置

使用uni.chooseLocation()打开地址选择位置&#xff1a; 在Uniapp源码视图进行设置 添加这个属性&#xff1a;"requiredPrivateInfos":["chooseLocation"] ​ </template><view class"location_box"><view class"locatio…...

学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

文章目录 课后练习解答需求分解增加KEY3控制代码如下&#xff1a; 第一版代码问题分析Tips&#xff1a;STC-ISP的设置 Tips&#xff1a;定时器实现完整电磁炉显示功能的代码测试流程 总结 课后练习解答 增加按键3&#xff0c;按下后表示启动&#xff0c;选择的对应的功能的LED…...

前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

一、 栈(stack)和 堆(heap) 栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#xff0c;并由系统自动释放&#xff0c;栈数据结构遵循FILO&#xff08;first in last out&#xff09;先进后出的原则&#xff0c;较为经典的就是乒乓球盒结…...

自然语言处理:大语言模型入门介绍

自然语言处理&#xff1a;大语言模型入门介绍 语言模型的历史演进大语言模型基础知识预训练Pre-traning微调Fine-Tuning指令微调Instruction Tuning对齐微调Alignment Tuning 提示Prompt上下文学习In-context Learning思维链Chain-of-thought提示开发&#xff08;调用ChatGPT的…...

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲&#xff0c;主要包括以下内容&#xff1a; NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…...

对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理?

对于pycharm 运行的时候不在cmd中运行&#xff0c;而是在python控制台运行的情况&#xff0c;如何处理&#xff1f; 比如&#xff0c;你在运行你的代码的时候 它总在python控制台运行&#xff0c;十分难受 解决方法 在pycharm中设置下即可&#xff0c;很简单 选择运行点击…...

Spring MVC 二 :基于xml配置

创建一个基于xml配置的Spring MVC项目。 Idea创建新项目&#xff0c;pom文件引入依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.12.RELEASE</version>…...

springboot aop方式实现接口入参校验

一、前言 在实际开发项目中&#xff0c;我们常常需要对接口入参进行校验&#xff0c;如果直接在业务代码中进行校验&#xff0c;则会显得代码非常冗余&#xff0c;也不够优雅&#xff0c;那么我们可以使用aop的方式校验&#xff0c;这样则会显得更优雅。 二、如何实现&#xf…...

解决git上传远程仓库时的大文件提交

在git中超过100M的文件会上传失败&#xff0c;而当一个文件超过50M时会给你警告&#xff0c;如下 warning: File XXXXXX is 51.42 MB; this is larger than GitHubs recommended maximum file size of 50.00 MB 解决这种问题&#xff0c;首先在项目的.git文件夹中找到.gitigno…...

HTML学习笔记02

HTML笔记02 页面结构分析 元素名描述header标题头部区域的内容&#xff08;用于页面或页面中的一块区域&#xff09;footer标记脚部区域的内容&#xff08;用于整个页面或页面的一块区域&#xff09;sectionWeb页面中的一块独立区域article独立的文章内容aside相关内容或应用…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...