如何基于FFT直方图尖峰检测判断图像是否存在块效应
无参考图像块效应(像素化)检测实现
块效应本质是有损压缩(典型如JPEG)采用固定大小分块量化带来的块边界周期性不连续,这种周期性信号在傅里叶频谱的X、Y轴中心线上会形成规律的对称尖峰,完全可以在无原图参考的前提下完成检测。
基于傅里叶变换的完整实现流程
你已经完成了图像读入、灰度化、傅里叶变换和频谱中心化的步骤,后续按以下逻辑补全即可:
1. 频谱预处理
中心化后的频谱直流分量(零频点)幅值远高于其他频率,会干扰尖峰检测,首先做幅值归一化和直流抑制:
import cv2 import numpy as np from scipy.signal import find_peaks # 已完成的基础代码 im = cv2.imread('image1.jpg') gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) h, w = gray.shape fft = np.fft.fft2(gray) fftShift = np.fft.fftshift(fft) # 计算对数幅值谱,压缩动态范围 magnitude = 20 * np.log(np.abs(fftShift) + 1e-8) # 抑制中心直流分量:将中心3x3区域替换为全局幅值均值,避免直流峰淹没其他尖峰 center_h, center_w = h//2, w//2 magnitude[center_h-1:center_h+2, center_w-1:center_w+2] = magnitude.mean()
2. 提取轴向投影
沿X、Y轴的中心带取平均投影,比单行/单列取数抗噪性更好:
# 取中心上下各3行做平均,得到水平方向投影(检测垂直块边界对应的频域尖峰) proj_y = np.mean(magnitude[center_h-3:center_h+4, :], axis=0) # 取中心左右各3列做平均,得到垂直方向投影(检测水平块边界对应的频域尖峰) proj_x = np.mean(magnitude[:, center_w-3:center_w+4], axis=1)
3. 用find_peaks检测尖峰
针对块效应的尖峰特征,find_peaks的参数设置如下,避免把噪声、纹理误判为块效应尖峰:
def detect_block_peaks(proj, img_side_len): # 峰值高度阈值:高于投影均值+2.5倍标准差才算有效尖峰 height_thresh = np.mean(proj) + 2.5 * np.std(proj) # 峰值最小间隔:常见压缩块大小为4~32像素,对应频域间隔为img_side_len/block_size,这里设最小间隔为对应32像素块的频域间隔 min_peak_dist = int(img_side_len / 64) # 峰值突出度阈值:过滤平缓的小凸起 prominence_thresh = 0.8 * np.std(proj) peaks, _ = find_peaks( proj, height=height_thresh, distance=min_peak_dist, prominence=prominence_thresh ) # 校验尖峰是否关于中心对称:块效应的尖峰一定成对出现在中心两侧 valid_peaks = [] for p in peaks: mirror_p = 2 * (len(proj)//2) - p if mirror_p in peaks: valid_peaks.append(p) return valid_peaks x_peaks = detect_block_peaks(proj_x, h) y_peaks = detect_block_peaks(proj_y, w)
4. 判定逻辑
如果X、Y方向都检测到至少2个有效对称尖峰,且尖峰间隔对应4~32像素的常见块大小,即可判定存在块效应:
has_block_artifact = len(x_peaks) >=2 and len(y_peaks) >=2
优化方案(降低误判率)
纯频域检测容易把图像本身的周期性纹理(比如砖墙、格栅、纺织纹路)误判为块效应,可以补充两个校验步骤提升准确率:
- 尖峰间隔校验:计算有效尖峰到频谱中心的距离,所有距离应该是某个固定值的整数倍,换算到空域对应的块大小落在4~32像素区间内才符合块效应特征
- 空域二次校验:按检测到的块大小将图像分块,分别计算块边界相邻像素的灰度差均值、块内部相邻像素的灰度差均值,如果边界差比内部差高1.5倍以上,即可确认是压缩带来的块效应,而非自然纹理。
内容的提问来源于stack exchange,提问作者harish
相关产品推荐
相关产品推荐

