ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

图像频域分析入门:低频、中频与高频如何影响图像处理

图像频域分析入门:低频、中频与高频如何影响图像处理 做图像处理这些年经常被人问到一个问题总听别人说图像的低频、中频、高频信息到底是什么意思这个问题看着基础但如果你真能把它彻底想明白傅里叶变换、频率谱、高斯滤波、图像锐化、JPEG压缩、超分辨率重建……这一整条知识线都会被串起来。我当年也是从频谱图中间亮一块、四周有些亮点这个现象开始一步步把频域这个概念啃下来的。这篇文章我不打算只给你贴概念而是从信号和图像的对应关系讲起把低频、中频、高频分别对应图像里的什么内容、在哪些实际任务里起作用、怎么用代码把这三部分拆开来看一次性讲透。适合刚接触图像处理的学生、转行做算法工程师的初学者以及那些写了很久图像代码但始终没搞明白频域含义的开发者。1. 从空间域到频率域图像是信号的另一种视角1.1 图像在频率域里到底是什么我们平时看到的图像是一个平面上的像素点阵每个像素有一个灰度值或者颜色值这种描述方式叫空间域。但同一个图像其实还可以换一种完全等价的方式来描述把它看作无数个不同频率、不同方向、不同幅度的正弦波叠加在一起的结果。这就是频率域或者说傅里叶域。这个概念乍一听有点抽象我习惯拿声音来类比。一段音乐里的低音鼓能量集中在中低频敲击声和人声的齿音属于中高频。声音的频率描述的是气压随时间振动的快慢图像的频率描述的则是像素灰度在空间上变化的快慢。低频对应灰度变化平缓的区域高频对应灰度变化剧烈的位置。把一张空白的墙壁照片做傅里叶变换你会发现绝大部分能量都集中在极低频把一张满是草丛叶脉的照片丢进去高频分量会明显变多。严格来说图像是二维的参与叠加的每个正弦波不只有频率还有方向所以图像的频谱图是个二维平面。做二维离散傅里叶变换后每个频点都代表一个特定频率、特定方向的正弦分量幅值大小代表这个分量在原图里占的比重相位则记录它的位置信息。这里有个容易被忽略的点频域里包含幅值和相位两部分信息而人眼对幅值更敏感算法上却往往相位更重要。因为相位决定了这些正弦波叠在哪、怎么对齐乱改相位等于重组了整个图像的结构。1.2 为什么看懂频域能少走很多弯路很多人在空域里处理图像感觉也能凑合干活想模糊就做高斯卷积想锐化就用拉普拉斯算子想降噪就滤波。但这些操作的本质全都是在调整频率成分。高斯模糊是低通滤波把高频衰减掉拉普拉斯算子是高通滤波把低频去掉只留边缘中值滤波是空域上的非线性平滑对脉冲噪声有效本质上也相当于某种自适应频率抑制。当你只在空域里操作时很多问题会被掩盖——比如为什么高斯模糊的窗口设大了图像会发虚为什么用均值滤波去噪后边缘也跟着模糊为什么拉普拉斯锐化一不小心就出现奇怪的颗粒噪点。这些问题说到底都是频率处理的问题分辨率多少、哪些频段该保留、哪些该削弱、保留多少全在一个频带划分里。用频率域的视角去看很多经验参数就不再是拍脑袋拍出来的而是对应了明确的物理含义。另外一个更重要的是现代图像算法里大量任务本质上就是在做频率管理。图像去噪是抑制噪声所在的高频同时保护边缘图像超分和去模糊是恢复丢失的高频细节JPEG压缩是量化掉人眼不敏感的高频医学MRI成像更是直接在频域k空间里采样的。可以说不理解频域你就永远只能抄别人的滤波器参数很难自己设计新的方案。2. 低频信息图像的骨架与整体基调2.1 低频对应画面里哪种感觉低频信息描述的是图像里灰度变化非常缓慢的区域。你可以把低频想象成在远处看一张照片先忽略所有细节只看到大体的明暗分布、整体轮廓、光照方向。一张人脸照片的低频部分就是你眯起眼睛看到的那个发光的皮肤块、脸两侧的阴影、头发整体的一团黑色而不是眉毛、睫毛、发丝这些精细结构。具体到数值上经过傅里叶变换后频谱正中心那个点是直流分量零频率代表整张图的平均亮度越靠近中心频率越低。自然图像里绝大多数能量都集中在低频区域这也是为什么频谱图中心总是有一个特别亮的大光斑。低频部分的幅值普遍很大说明图像的基本面貌主要由低频决定——亮度、渐变、大的形状结构全部由低频撑着。我常说低频是图像的骨架因为如果你把除了低频以外的所有频率都砍掉再做逆变换得到的仍然是一张能认出整体内容的模糊图虽然边缘细节全没了但物体的边界、亮度层次还在。反过来如果只保留高频图像就会变成一张边缘线稿一样的图你很难立刻看出原来物体的材质、颜色和光照关系。2.2 低频在工程里的经典用处低频分量在实际工程里第一个重要应用就是JPEG压缩。JPEG做DCT变换后会对每个8x8块的变换系数做量化量化表里低频位置的步长很小误差控制得很紧高频位置的步长很大可以舍弃更多的“次要”系数。人眼对低频亮度变化的失真非常敏感而对高频细节的容忍度相对较高。所以你拿手机拍一张纯色天空的照片哪怕压缩率很高大面积天空的色调层次还是能保持得很好但云朵边缘容易出现块状伪影和振铃就是因为高频被重压掉了。第二个常见应用是光照归一化。人脸识别、文字检测这类任务里光照变化很容易干扰模型。很多时候想去除光照影响最简单的做法就是对图像做一次大的低通滤波得到“光照层”然后用原图减掉它剩下的就是不受整体照明影响的细节和反射部分。这里选择多大半径的滤波器本质上就是在判断“多大尺度以上的变化算光照、以下算纹理”这是一个低频截止频率的选择问题。另外图像融合和多尺度增强里也经常用到低频。拉普拉斯金字塔每一层的融合实际上就是按空间尺度把图像分成不同频段后逐层决定从哪张源图取哪一段频率成分。底层那些大尺度分量决定融合结果的全局色调这就是低频在操控。3. 中频信息纹理与材质的中间层3.1 中频经常被忽略但它才是“质感”的来源低频和高频的概念很多人知道但中频往往被糊弄过去。其实中频段在视觉感知里非常关键。如果低频是轮廓和光照高频是边缘和噪点那中频就是介于两者之间、带方向性的纹理和材质信息。举几个例子木材的年轮纹路、皮革表面的细密毛孔、布料编织的经纬纹路、皮肤上淡淡的肌理感大部分能量都在中频。这类信息既不像大面积阴影那样变化缓慢也不像物体轮廓边缘那样尖锐突变它们的灰度变化速度居中通常还带有比较明显的方向性。你用一段频率响应的语言来说中频就是带通滤波器DoG、拉普拉斯金字塔的中间层能取出来的那一部分。中频在视觉上决定了一件东西看起来是什么材质。同样一个圆柱体涂成哑光塑料和涂成拉丝金属高频边缘可能都很锐利低频阴影也差不太多但中频的纹理分布完全不同。很多图像处理操作如果中频被破坏画面就会有一种说不出的塑料感或假面感即使边缘很锐利、色调很准确看起来还是不自然。所以修图里常说的“保留质感”本质就是“保护中频”。3.2 频率分离和带通操作里的中频实战在摄影后期和商业修图里有一项经典技术叫频率分离Frequency Separation核心就是手动把图像按频率分成低频层和高频层然后分别处理避免把皮肤的瑕疵处理掉的同时也把毛孔纹理带没了。实际操作中通常是复制一层背景层做高斯模糊作为低频层再用原图减去低频层得到高频层。低频层里可以放心修匀肤色、调整光影因为纹理细节已经不在这层里高频层里可以单独处理痘痘、皱纹这些尖锐瑕疵不用担心破坏大面积色调。但如果想处理得更精细就需要把中频单独分离出来。逻辑也不复杂用高斯模糊提取一个“较粗的低频层”再用另一个更小半径的高斯模糊提取一个“较细的低频层”原图中介于这两者之间的成分就是中频。换句话说中频等于两个不同截止频率的低通滤波结果相减这也是经典的高斯差分DoG思路。DoG能提取边缘但做参数调整时较大半径的sigma决定提取多大尺度结构的边缘这就是在选频段。在图像融合、风格迁移、超分预处理中中频也很关键。风格迁移如果只控制高频特征很容易出现纹理乱飞如果只控制低频颜色风格对了但质感丢失。很多效果好的方法会分别约束低、中、高三个频段的感知损失让生成的图像大结构稳定、材质真实、边缘锐利。3.3 如何用肉眼判断中频范围做实验时最直接的方法是看滤波半径。假设图像尺寸是512x512用标准差为5像素的高斯核做模糊得到的低频层差不多保留了直径10像素以上渐变尺度用标准差为1像素的高斯核再做一次模糊原图减去这个结果得到的基本是1-2像素级别的细节。那么中频大概就是“5像素模糊层减去1像素模糊层”之间的部分对应的就是面颊上那种柔和而不突兀的毛孔质感。这个半径不是绝对标准要看你处理的图像分辨率和内容尺度但思路是通用的先用大核取低通再用小核取另一层低通相减即是中频带。我自己调频率分离参数时的心得是大核半径通常取10到30像素小核半径取0.5到3像素。大核太小会把皮肤纹理也划进低频后续修光影时会连带磨掉质感大核太大又会让低频层携带太多明暗结构处理起来会很费劲。宁可低频层取得偏“平”一些也不要让它在光影复杂区域出现伪边缘。4. 高频信息边缘、细节与噪声4.1 高频区域的真实构成高频信息对应像素值在极短距离内发生剧烈变化的位置包括物体边缘、角点、文字笔画、衣物褶皱的锐利轮廓也包括图像传感器产生的噪声、压缩造成的块效应边界。这些成分在频谱上表现为距离中心光斑较远的亮点分散在整个频率平面。特别要强调的是边缘和高频并不完全是一回事。一个理想的阶跃边缘傅里叶变换后会在高频区域产生大量分量所以高通滤波能看到边缘。但噪声同样是高频一个孤立的噪点像素比任何边缘都更“陡峭”频率范围更宽。所以做高通滤波时你看到的往往不只有轮廓还夹杂着很多颗粒感因为高通滤波器把噪声也一并放大了。这就是为什么空域锐化拉普拉斯算子、USM在噪声大的图片上会把噪点放大得很明显。高频的幅值通常远低于低频。自然图像频谱的能量分布从中心向四周快速衰减高频区域往往是一小点一小点的亮斑如果不做对数拉伸几乎看不清。这也解释了为什么压缩时可以丢弃一部分高频却不至于让画面立刻崩掉——它们对总体能量的贡献确实小但视觉上的存在感很强。4.2 高频在去噪和边缘增强里的双刃剑作用高频处理最有代表性的就是图像去噪和图像锐化。先看去噪高斯噪声、传感器热噪声都集中在中高频最朴素的做法是做低通滤波把高频抑制掉。但这样边缘也会被抹掉因为边缘也是高频。于是诞生了一类方法保边滤波双边滤波、引导滤波、各向异性扩散、小波阈值收缩、NLM等本质上都是希望“在有边缘的地方保留高频在平坦区域抑制高频”。更现代的深度学习去噪模型比如DnCNN学到的本质上也是在噪声和真实细节之间做频率加权网络内部大量卷积核天然具备频带选择性浅层特征倾向于提取不同方向的边缘和纹理深层通过残差结构去预测噪声残差也就是高频分量中“不值得保留”的那部分。再看锐化USMUnsharp Mask的做法是原图减去模糊图得到高频细节再把这个细节乘上一个增益加回原图。用频率的语言说就是提高高频段的增益让边缘两侧的对比度变得更大。增益设太高时高频噪声被同步放大边缘附近会出现光晕和白色颗粒这就是高频过度增强的典型症状。实际调USM时我一般先把Amount控制在0.5到1.5半径控制在1到3像素然后先放大到200%观察边缘有没有白边再决定要不要加Threshold来保护低频平坦区。4.3 高频丢失后的典型伪影图像被降采样、经过强压缩或做过模糊去噪后高频损失会带来两类典型伪影一类是整体发虚、边缘模糊另一类更隐蔽——振铃。振铃的产生通常来自频域的硬截断对图像做快速傅里叶变换直接用一个硬掩膜把高频置零相当于在频域乘了一个矩形窗反变换回空间域后每个原始边缘附近都会出现一圈一圈的明暗条纹像回声一样沿着边缘扩散。这也是为什么真正工程上很少用理想低通滤波而更偏爱高斯低通因为高斯函数的傅里叶变换还是高斯函数频域和空域都没有尖锐的截止边缘振铃要小得多。我在做频域滤波实验时经常提醒同学如果逆变换后图像出现一圈圈的波纹先检查掩膜边缘是不是太陡了换成标准差合理的Gaussian窗马上就会好。5. 动手实践用FFT把图像频段拆开5.1 频域分析与滤波的完整小例程纸上谈兵没有用我直接给一套Python代码你跑一遍就能看到低频、中频、高频各自长什么样。需要安装numpy和opencv-python这是我的测试版本组合numpy 1.24.3opencv-python 4.8.1Python 3.10。import numpy as np import cv2 def fft_analysis(path): # 以灰度图方式读入 img cv2.imread(path, cv2.IMREAD_GRAYSCALE) if img is None: raise ValueError(图片读取失败请检查路径) rows, cols img.shape # 做二维FFT并将低频分量移动到频谱中心 f np.fft.fft2(img.astype(np.float32)) fshift np.fft.fftshift(f) # 幅度谱加1后取对数便于显示弱小的中高频分量 magnitude np.log(np.abs(fshift) 1.0) magnitude_norm cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX) cv2.imwrite(spectrum.png, magnitude_norm.astype(np.uint8)) # 中心坐标 crow, ccol rows // 2, cols // 2 # 构造高斯低通掩膜cutoff为截止频率半径 def gaussian_lowpass(shape, cutoff): x np.arange(shape[1]).reshape(1, -1) - shape[1] // 2 y np.arange(shape[0]).reshape(-1, 1) - shape[0] // 2 d2 x ** 2 y ** 2 return np.exp(-d2 / (2 * cutoff ** 2)) # 高斯高通掩膜 1 - 低通掩膜 cutoff_low 30 mask_low gaussian_lowpass((rows, cols), cutoff_low) mask_high 1 - gaussian_lowpass((rows, cols), 8) # 带通掩膜两个低通相减保留中频 mask_band gaussian_lowpass((rows, cols), 40) - gaussian_lowpass((rows, cols), 10) # 分别滤波 low_fshift fshift * mask_low high_fshift fshift * mask_high band_fshift fshift * mask_band # 逆变换回空间域 def invert(fshifted): f_ishift np.fft.ifftshift(fshifted) recon np.fft.ifft2(f_ishift) return np.clip(recon.real, 0, 255).astype(np.uint8) low_img invert(low_fshift) high_img invert(high_fshift) band_img invert(band_fshift) cv2.imwrite(low_freq.png, low_img) cv2.imwrite(medium_freq.png, band_img) cv2.imwrite(high_freq.png, high_img) if __name__ __main__: fft_analysis(test.jpg)这套代码里有个关键操作np.fft.fftshift把零频分量从矩阵四角移动到中心。因为FFT结果的四个角对应低频中心对应最高频直接处理很反直觉经过shift后的频谱中心亮斑就是低频越往外圈频率越高。处理完再做ifftshift把坐标搬回去最后逆变换取实部。5.2 频率分离后的直观观察跑完代码后你会得到三张鲜明的图。low_freq.png是一张非常平滑、几乎看不到任何纹理细节的图但画面整体的明暗布局、大块颜色都非常清楚——这就是低频。high_freq.png里图像变成了一张边缘图所有物体轮廓、文字、纹理的尖锐部分都变成了亮线或者亮点背景大面积区域几乎是均匀的灰色因为平坦区域的高频能量接近零而且高通滤波把直流分量滤掉了平均灰度会被拉低。medium_freq.png是最有意思的一张它既没有平滑到糊成一团也没有只保留边缘而是能看到皮肤纹理、衣服褶皱、木纹这些带有质感和方向性的细节。这里有一个容易被误读的地方你在high_freq.png里看到许多白线并不代表这张图亮度高而是因为逆变换后像素值在0附近剧烈波动显示时有的像素被裁到255、有的裁到0看起来才有明显的白线黑底。如果你想看得更舒服可以把high_freq.png再做一个简单的直方图均衡化或者加上一个很小的直流偏移比如加上128再显示这样会更接近真实的“细节层”。5.3 参数选择的几个经验截止频率选多少直接决定你保留多少细节。我给的例子里低通截止30像素带通两端分别取10和40像素都是相对保守的值。实际使用时可以这样判断先观察频谱图如果低频光斑的半径大概在多少范围内cutoff就取那个范围的一半到三分之二。图像尺寸更大、内容更细腻cutoff可以适当调大主要处理人脸这类局部变化平稳的内容cutoff可以小一点。filter掩膜一定要用连续平滑的边界。你可以在程序里换成理想的硬截断掩膜试试对比图像边缘马上会出现振铃。高斯窗虽然也不完美但它在空频两域都是平滑的工程上最省心。如果你想进一步提高保真度可以把窗口设计成巴特沃斯形状通过阶数控制过渡带陡峭程度。6. 用频域视角看懂经典图像任务6.1 去噪的本质是区分高频里的“信号”和“垃圾”图像噪声在频谱上通常表现为均匀分布在整个频率平面的细小亮点尤其是高斯白噪声几乎每个频点都有一点能量。而真实图像本身的高频分量并不是均匀的它集中在边缘和纹理的方向上通常沿着几个主方向分布。这意味着从频域角度看去噪本质上是在高频区里判断哪些能量是可信的边缘纹理、哪些是杂乱的噪声。经典方法是先做一个低通滤波把主体恢复出来然后用原图减去低通结果得到高频残差再对这个残差做阈值收缩——软阈值或硬阈值。小波去噪就是这个思路的升级版小波变换把图像分解成多层高频子带每一层的阈值独立调整层数越深、对应频率越低阈值越小。深度学习时代很多去噪网络的内部结构也保留了类似逻辑卷积层的感受野和频带选择性决定了网络对高频噪声的抑制能力和对真实纹理的保护能力。实操上最常见的误区是看到噪声就直接全图低通结果图确实干净了人像皮肤也变成了塑胶。正确流程是先把亮度通道分离转到YUV或LAB色彩空间只对Y或L通道做去噪颜色通道本身噪声较少、人眼对彩色噪声不敏感这样可以保留更多细节然后加一个边缘保护操作比如双边滤波或引导滤波。如果你还是在用普通高斯模糊做预处理建议尽快切换到导向滤波计算量不大效果却好一个档次。6.2 超分辨率与图像去模糊一项恢复高频的“逆问题”图像模糊和降采样在频域上等效于乘了一个低通函数原本的高频成分被大幅衰减部分甚至衰减到接近零。超分辨率重建和去模糊的复杂度在于被丢失的高频信息不是没了而是和噪声混在了一起、被压缩到低幅值区域。简单放大后再高通增强只会把噪声放大出不来真正的高频纹理。所以这类算法本质上是在从“图片的低频部分”和“外部先验信息”中反向推断本该有的高频细节。拿传统插值作类比双线性插值等效于一个固定滤波器恢复的高频微乎其微Lanczos插值稍微聪明一些加了一个更宽的滤波核也只是勉强补回中频。深度学习超分模型SRCNN、EDSR、SRGAN这些之所以效果好就是因为网络直接学习从低分辨率低频特征到高分辨率高频细节的映射关系本质上是一个数据驱动的逆滤波过程。所以你在训练一个超分模型或者用预训练模型时一定要明白它对高频的恢复能力是有极限的它是在“猜”细节不是“恢复”细节。医学图像里MRI直接就在频域采样。k空间的中心区域对应低频决定图像对比度和大体轮廓外围对应高频决定解剖细节。临床上常做的“部分傅里叶采样加速”就是减少外围高频采样点来缩短扫描时间再用重建算法补回去。理解了频域你看那些MRI重建论文里的“欠采样伪影”会非常清楚外围高频缺失图像在边缘处就会出现条纹状的模糊和振铃。6.3 压缩编码眼睛看不出的高频能丢就丢JPEG这类基于块DCT的编码器之所以敢大幅度量化高频系数是因为人眼的对比度敏感函数CSF对高频细节的敏感度显著降低。在一个8x8小块里左上角的直流和极低频系数必须保留得比较准否则整块颜色的偏差立刻会被察觉右下角的高频系数量化步长可以变得很大很多直接量化成零靠的就是“人眼基本看不出来”这个底气。HEIF、AVIF和H.266这类现代编码标准虽然使用了更复杂的块划分、帧间预测和神经网络工具但核心环节依然离不开频域变换。它们会在变换后的频域里做自适应量化根据人对不同频率的敏感度分配比特数。这就是为什么视频编码领域的码率控制常常说“复杂度高”的区域——本质上是指图像局部高频能量大需要分配更多码字来维持可接受的主观质量。做图像质量评估时峰值信噪比PSNR在频域上对所有误差一视同仁所以经常出现PSNR很高但视觉上却很糊的压缩结果。更符合人眼感受的SSIM指标能稍微好一点因为它在局部结构上做对比相当于隐式地给不同频段赋予了不同的权重。实际操作中如果你在给公司做图像压缩管线的质量评测建议除了PSNR、SSIM之外再看看压缩前后图像的功率谱曲线差异很多视觉瑕疵在频谱图上一目了然。6.4 频域思维能帮我们重新设计数据增强最后一个我觉得很实用的点是对图像增强策略的启发。很多人做数据增强就是随机翻转、旋转、调亮度很少在频域上下功夫。但很多真实场景的域差异本质上是频率分布的差异监控摄像头图像偏模糊、高频弱手机HDR照片亮度层次丰富中低频能量分布不同扫描文档文字锐利、高频集中。这些差异如果只在空域里做增强很难模拟。比如做人脸识别模型时我习惯对训练集做随机的频域扰动把图像变换到频域对高频系数乘一个随机缩放因子或者随机去掉一部分高频模拟不同镜头、不同对焦效果。这样做的增强比单纯加高斯噪声更符合实际退化模式模型在真实低质图像上的鲁棒性会明显更好。具体实现也不复杂就是在FFT变换后构造一个随机的频域mask乘上去再逆变换代码十几行就能搞定。我在这里还有一个小技巧如果想直观检查一个数据集是否存在频率上的偏置把所有图像缩放到统一尺寸分别做FFT求平均幅度谱然后看能量分布中心和外周的比值。如果训练集和测试集在频率能量分布上差异过大模型效果很可能在换场景后崩掉。这个检查方法在工业项目中非常实用。从空间域“看到”频率域我的经验是要多动手做可视化对比。拿同一张图分别做低通、带通、高通后三张图并排看一遍一个下午就能建立频域直觉。之后再回头理解去噪、压缩、超分、锐化这些经典任务你会有一种豁然开朗的感觉所有操作其实都是在调整频段的权重。这套理解比背再多的公式都值钱。
返回列表