You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 04:12:55