当前位置:首页>python>OpenCV 滤波算法全面解析与python代码实现

OpenCV 滤波算法全面解析与python代码实现

  • 2026-02-01 12:26:32
OpenCV 滤波算法全面解析与python代码实现

OpenCV 滤波算法全面解析与代码实现

一、滤波算法概述

1.1 滤波的基本概念

滤波是图像处理中的基本操作,主要用于:

  • • 消除图像噪声
  • • 平滑图像
  • • 增强图像特征
  • • 边缘检测
  • • 图像锐化

二、基本线性滤波算法

2.1 均值滤波(Average Filter)

原理用邻域像素的平均值替换中心像素值

# 应用场景:去除随机噪声,简单平滑处理def mean_filter_example(img_rgb):    # 使用3x3核    kernel_size = (33)    mean_filtered = cv2.blur(img_rgb, kernel_size)    # 使用5x5核    mean_filtered_large = cv2.blur(img_rgb, (55))    # 显示结果    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original Image')    axes[0].axis('off')    axes[1].imshow(mean_filtered)    axes[1].set_title('3x3 Mean Filter')    axes[1].axis('off')    axes[2].imshow(mean_filtered_large)    axes[2].set_title('5x5 Mean Filter')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return mean_filtered

2.2 高斯滤波(Gaussian Filter)

原理使用高斯函数作为权重核,距离中心越近权重越大

# 应用场景:去除高斯噪声,图像预处理,降采样前的平滑def gaussian_filter_example(img_rgb):    # 不同标准差的高斯滤波    gaussian_small = cv2.GaussianBlur(img_rgb, (33), 0)  # sigma=0,自动计算    gaussian_medium = cv2.GaussianBlur(img_rgb, (55), 1.0)    gaussian_large = cv2.GaussianBlur(img_rgb, (99), 2.0)    # 显示结果    fig, axes = plt.subplots(22, figsize=(1210))    axes[00].imshow(img_rgb)    axes[00].set_title('Original Image')    axes[00].axis('off')    axes[01].imshow(gaussian_small)    axes[01].set_title('Gaussian 3x3, σ=auto')    axes[01].axis('off')    axes[10].imshow(gaussian_medium)    axes[10].set_title('Gaussian 5x5, σ=1.0')    axes[10].axis('off')    axes[11].imshow(gaussian_large)    axes[11].set_title('Gaussian 9x9, σ=2.0')    axes[11].axis('off')    plt.tight_layout()    plt.show()    return gaussian_medium

2.3 方框滤波(Box Filter)

原理均值滤波的推广,可控制是否归一化

# 应用场景:快速平滑,积分图像计算def box_filter_example(img_rgb):    # 归一化的方框滤波(等同于均值滤波)    box_normalized = cv2.boxFilter(img_rgb, -1, (33), normalize=True)    # 非归一化的方框滤波(像素值会累积)    box_non_normalized = cv2.boxFilter(img_rgb, -1, (33), normalize=False)    box_non_normalized = np.clip(box_non_normalized / 25501)  # 归一化显示    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original Image')    axes[0].axis('off')    axes[1].imshow(box_normalized)    axes[1].set_title('Normalized Box Filter 3x3')    axes[1].axis('off')    axes[2].imshow(box_non_normalized)    axes[2].set_title('Non-Normalized Box Filter 3x3')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return box_normalized

三、非线性滤波算法

3.1 中值滤波(Median Filter)

原理用邻域像素的中值替换中心像素

# 应用场景:去除椒盐噪声,保护边缘def median_filter_example(img_rgb):    # 添加椒盐噪声    noisy_img = img_rgb.copy()    noise_prob = 0.05    noise_mask = np.random.random(noisy_img.shape[:2]) < noise_prob    # 添加椒盐噪声    noisy_img[noise_mask] = 0  # 黑点    noisy_img[np.random.random(noisy_img.shape[:2]) < noise_prob/2] = 255  # 白点    # 应用中值滤波    median_3 = cv2.medianBlur(noisy_img.astype(np.uint8), 3)    median_5 = cv2.medianBlur(noisy_img.astype(np.uint8), 5)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(noisy_img)    axes[0].set_title('Image with Salt & Pepper Noise')    axes[0].axis('off')    axes[1].imshow(median_3)    axes[1].set_title('Median Filter 3x3')    axes[1].axis('off')    axes[2].imshow(median_5)    axes[2].set_title('Median Filter 5x5')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return median_3

3.2 双边滤波(Bilateral Filter)

原理:结合空间距离和像素值相似性的权重

# 应用场景:边缘保持平滑,美颜滤镜,去噪同时保留细节def bilateral_filter_example(img_rgb):    # 双边滤波参数:d为邻域直径,sigmaColor为颜色空间标准差,sigmaSpace为坐标空间标准差    bilateral_small = cv2.bilateralFilter(img_rgb, d=9, sigmaColor=75, sigmaSpace=75)    bilateral_large = cv2.bilateralFilter(img_rgb, d=15, sigmaColor=150, sigmaSpace=150)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original Image')    axes[0].axis('off')    axes[1].imshow(bilateral_small)    axes[1].set_title('Bilateral Filter (d=9, σ=75)')    axes[1].axis('off')    axes[2].imshow(bilateral_large)    axes[2].set_title('Bilateral Filter (d=15, σ=150)')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return bilateral_small

四、边缘检测滤波器

4.1 Sobel算子

原理计算图像梯度,检测水平或垂直边缘

# 应用场景:边缘检测,梯度计算def sobel_filter_example(img_rgb):    # 转换为灰度图    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # Sobel算子    sobel_x = cv2.Sobel(gray, cv2.CV_64F, 10, ksize=3)    sobel_y = cv2.Sobel(gray, cv2.CV_64F, 01, ksize=3)    # 计算梯度幅值    sobel_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)    sobel_magnitude = np.uint8(255 * sobel_magnitude / np.max(sobel_magnitude))    # 计算梯度方向    sobel_direction = np.arctan2(np.abs(sobel_y), np.abs(sobel_x))    fig, axes = plt.subplots(23, figsize=(1510))    axes[00].imshow(gray, cmap='gray')    axes[00].set_title('Original Grayscale')    axes[00].axis('off')    axes[01].imshow(np.abs(sobel_x), cmap='gray')    axes[01].set_title('Sobel X')    axes[01].axis('off')    axes[02].imshow(np.abs(sobel_y), cmap='gray')    axes[02].set_title('Sobel Y')    axes[02].axis('off')    axes[10].imshow(sobel_magnitude, cmap='gray')    axes[10].set_title('Gradient Magnitude')    axes[10].axis('off')    axes[11].imshow(sobel_direction, cmap='hsv')    axes[11].set_title('Gradient Direction')    axes[11].axis('off')    # 合并X和Y    sobel_combined = cv2.addWeighted(np.abs(sobel_x), 0.5, np.abs(sobel_y), 0.50)    axes[12].imshow(sobel_combined, cmap='gray')    axes[12].set_title('Combined Sobel')    axes[12].axis('off')    plt.tight_layout()    plt.show()    return sobel_magnitude

4.2 Scharr算子

原理:Sobel的改进,对边缘响应更强

# 应用场景:更精确的边缘检测def scharr_filter_example(img_rgb):    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    scharr_x = cv2.Scharr(gray, cv2.CV_64F, 10)    scharr_y = cv2.Scharr(gray, cv2.CV_64F, 01)    scharr_magnitude = np.sqrt(scharr_x**2 + scharr_y**2)    scharr_magnitude = np.uint8(255 * scharr_magnitude / np.max(scharr_magnitude))    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(gray, cmap='gray')    axes[0].set_title('Original Grayscale')    axes[0].axis('off')    axes[1].imshow(np.abs(scharr_x), cmap='gray')    axes[1].set_title('Scharr X')    axes[1].axis('off')    axes[2].imshow(np.abs(scharr_y), cmap='gray')    axes[2].set_title('Scharr Y')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return scharr_magnitude

4.3 Laplacian算子

原理:二阶微分算子,检测图像强度的快速变化

# 应用场景:边缘检测,角点检测,图像锐化def laplacian_filter_example(img_rgb):    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 应用高斯模糊后使用Laplacian    blurred = cv2.GaussianBlur(gray, (33), 0)    # Laplacian算子    laplacian = cv2.Laplacian(blurred, cv2.CV_64F)    laplacian_abs = np.uint8(np.absolute(laplacian))    # 零交叉检测    laplacian_zero_cross = np.zeros_like(laplacian_abs)    laplacian_zero_cross[laplacian_abs > 30] = 255    fig, axes = plt.subplots(14, figsize=(205))    axes[0].imshow(gray, cmap='gray')    axes[0].set_title('Original Grayscale')    axes[0].axis('off')    axes[1].imshow(laplacian_abs, cmap='gray')    axes[1].set_title('Laplacian')    axes[1].axis('off')    axes[2].imshow(laplacian_zero_cross, cmap='gray')    axes[2].set_title('Zero Crossing (Threshold=30)')    axes[2].axis('off')    # LoG (Laplacian of Gaussian)    log_kernel = np.array([[010],                          [1, -41],                          [010]], dtype=np.float32)    log_filtered = cv2.filter2D(blurred, -1, log_kernel)    axes[3].imshow(np.abs(log_filtered), cmap='gray')    axes[3].set_title('LoG Filtered')    axes[3].axis('off')    plt.tight_layout()    plt.show()    return laplacian_abs

4.4 Canny边缘检测

原理多阶段边缘检测算法

# 应用场景:精确边缘检测,计算机视觉预处理def canny_edge_detection(img_rgb):    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 不同阈值的Canny检测    canny_low = cv2.Canny(gray, 50150)    canny_medium = cv2.Canny(gray, 100200)    canny_high = cv2.Canny(gray, 150250)    # 自适应Canny    median_intensity = np.median(gray)    lower_thresh = int(max(00.7 * median_intensity))    upper_thresh = int(min(2551.3 * median_intensity))    canny_adaptive = cv2.Canny(gray, lower_thresh, upper_thresh)    fig, axes = plt.subplots(23, figsize=(1510))    axes[00].imshow(gray, cmap='gray')    axes[00].set_title('Original Grayscale')    axes[00].axis('off')    axes[01].imshow(canny_low, cmap='gray')    axes[01].set_title('Canny (50150)')    axes[01].axis('off')    axes[02].imshow(canny_medium, cmap='gray')    axes[02].set_title('Canny (100200)')    axes[02].axis('off')    axes[10].imshow(canny_high, cmap='gray')    axes[10].set_title('Canny (150250)')    axes[10].axis('off')    axes[11].imshow(canny_adaptive, cmap='gray')    axes[11].set_title(f'Adaptive Canny ({lower_thresh}, {upper_thresh})')    axes[11].axis('off')    axes[12].axis('off')    plt.tight_layout()    plt.show()    return canny_medium

五、高级滤波算法

5.1 导向滤波(Guided Filter)

# 应用场景:图像去噪,细节增强,HDR压缩def guided_filter_example(img_rgb):    """导向滤波实现"""    # 转换为浮点型    guide = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY).astype(np.float32) / 255.0    src = guide.copy()    # OpenCV中的导向滤波    guided = cv2.ximgproc.guidedFilter(guide=guide, src=src, radius=5, eps=0.01)    # 与双边滤波比较    bilateral = cv2.bilateralFilter((guide * 255).astype(np.uint8), 97575)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(guide, cmap='gray')    axes[0].set_title('Original')    axes[0].axis('off')    axes[1].imshow(guided, cmap='gray')    axes[1].set_title('Guided Filter')    axes[1].axis('off')    axes[2].imshow(bilateral, cmap='gray')    axes[2].set_title('Bilateral Filter')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return guided

5.2 非局部均值去噪(Non-Local Means Denoising)

# 应用场景:高质量图像去噪,医学图像处理def non_local_means_denoising(img_rgb):    """非局部均值去噪"""    # 添加高斯噪声    noisy = img_rgb.copy().astype(np.float32) / 255.0    noise = np.random.normal(00.1, noisy.shape)    noisy_with_gaussian = np.clip(noisy + noise, 01)    # 转换为uint8    noisy_uint8 = (noisy_with_gaussian * 255).astype(np.uint8)    # 应用非局部均值去噪    denoised = cv2.fastNlMeansDenoisingColored(noisy_uint8, None,                                                 h=10, hColor=10,                                                templateWindowSize=7,                                                searchWindowSize=21)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original')    axes[0].axis('off')    axes[1].imshow(noisy_uint8)    axes[1].set_title('With Gaussian Noise')    axes[1].axis('off')    axes[2].imshow(denoised)    axes[2].set_title('Non-Local Means Denoised')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return denoised

5.3 形态学滤波

# 应用场景:二值图像处理,形状分析,噪声去除def morphological_filters(img_rgb):    """形态学滤波"""    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 创建二值图像用于演示    _, binary = cv2.threshold(gray, 127255, cv2.THRESH_BINARY)    # 结构元素    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (55))    # 腐蚀    erosion = cv2.erode(binary, kernel, iterations=1)    # 膨胀    dilation = cv2.dilate(binary, kernel, iterations=1)    # 开运算(先腐蚀后膨胀)    opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)    # 闭运算(先膨胀后腐蚀)    closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)    # 形态学梯度    gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel)    fig, axes = plt.subplots(23, figsize=(1510))    axes[00].imshow(binary, cmap='gray')    axes[00].set_title('Binary Image')    axes[00].axis('off')    axes[01].imshow(erosion, cmap='gray')    axes[01].set_title('Erosion')    axes[01].axis('off')    axes[02].imshow(dilation, cmap='gray')    axes[02].set_title('Dilation')    axes[02].axis('off')    axes[10].imshow(opening, cmap='gray')    axes[10].set_title('Opening')    axes[10].axis('off')    axes[11].imshow(closing, cmap='gray')    axes[11].set_title('Closing')    axes[11].axis('off')    axes[12].imshow(gradient, cmap='gray')    axes[12].set_title('Morphological Gradient')    axes[12].axis('off')    plt.tight_layout()    plt.show()    return opening, closing

5.4 各向异性扩散滤波(Anisotropic Diffusion)

# 应用场景:医学图像处理,边缘保持平滑,纹理分析def anisotropic_diffusion(img_rgb):    """各向异性扩散滤波"""    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY).astype(np.float32)    # 简单的Perona-Malik各向异性扩散实现    def perona_malik_diffusion(img, iterations=10, kappa=50, gamma=0.1):        img_diffused = img.copy()        for _ in range(iterations):            # 计算梯度            grad_north = np.roll(img_diffused, -1, axis=0) - img_diffused            grad_south = np.roll(img_diffused, 1, axis=0) - img_diffused            grad_east = np.roll(img_diffused, -1, axis=1) - img_diffused            grad_west = np.roll(img_diffused, 1, axis=1) - img_diffused            # 扩散系数            c_north = 1.0 / (1.0 + (grad_north / kappa)**2)            c_south = 1.0 / (1.0 + (grad_south / kappa)**2)            c_east = 1.0 / (1.0 + (grad_east / kappa)**2)            c_west = 1.0 / (1.0 + (grad_west / kappa)**2)            # 更新图像            img_diffused += gamma * (c_north * grad_north +                                     c_south * grad_south +                                     c_east * grad_east +                                     c_west * grad_west)        return img_diffused    # 应用各向异性扩散    diffused = perona_malik_diffusion(gray, iterations=20, kappa=30, gamma=0.1)    fig, axes = plt.subplots(12, figsize=(126))    axes[0].imshow(gray, cmap='gray')    axes[0].set_title('Original Grayscale')    axes[0].axis('off')    axes[1].imshow(diffused, cmap='gray')    axes[1].set_title('Anisotropic Diffusion')    axes[1].axis('off')    plt.tight_layout()    plt.show()    return diffused

六、频率域滤波

6.1 傅里叶变换与频域滤波

# 应用场景:频域分析,周期性噪声去除,图像增强def frequency_domain_filtering(img_rgb):    """频域滤波"""    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 傅里叶变换    dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)    dft_shift = np.fft.fftshift(dft)    # 创建滤波器    rows, cols = gray.shape    crow, ccol = rows // 2, cols // 2    # 低通滤波器    mask_low = np.zeros((rows, cols, 2), np.uint8)    r = 30    mask_low[crow-r:crow+r, ccol-r:ccol+r] = 1    # 高通滤波器    mask_high = np.ones((rows, cols, 2), np.uint8)    r = 30    mask_high[crow-r:crow+r, ccol-r:ccol+r] = 0    # 带阻滤波器    mask_band = np.ones((rows, cols, 2), np.uint8)    r_outer = 60    r_inner = 20    cv2.circle(mask_band, (ccol, crow), r_outer, 0, -1)    cv2.circle(mask_band, (ccol, crow), r_inner, 1, -1)    # 应用滤波    fshift_low = dft_shift * mask_low    fshift_high = dft_shift * mask_high    fshift_band = dft_shift * mask_band    # 逆变换    def inverse_transform(fshift):        f_ishift = np.fft.ifftshift(fshift)        img_back = cv2.idft(f_ishift)        img_back = cv2.magnitude(img_back[:,:,0], img_back[:,:,1])        return cv2.normalize(img_back, None, 0255, cv2.NORM_MINMAX)    result_low = inverse_transform(fshift_low)    result_high = inverse_transform(fshift_high)    result_band = inverse_transform(fshift_band)    fig, axes = plt.subplots(24, figsize=(168))    # 显示原图和频谱    magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]) + 1)    axes[00].imshow(gray, cmap='gray')    axes[00].set_title('Original')    axes[00].axis('off')    axes[01].imshow(magnitude_spectrum, cmap='gray')    axes[01].set_title('Magnitude Spectrum')    axes[01].axis('off')    axes[02].imshow(mask_low[:,:,0], cmap='gray')    axes[02].set_title('Low Pass Filter')    axes[02].axis('off')    axes[03].imshow(result_low, cmap='gray')    axes[03].set_title('Low Pass Result')    axes[03].axis('off')    axes[10].imshow(mask_high[:,:,0], cmap='gray')    axes[10].set_title('High Pass Filter')    axes[10].axis('off')    axes[11].imshow(result_high, cmap='gray')    axes[11].set_title('High Pass Result')    axes[11].axis('off')    axes[12].imshow(mask_band[:,:,0], cmap='gray')    axes[12].set_title('Band Stop Filter')    axes[12].axis('off')    axes[13].imshow(result_band, cmap='gray')    axes[13].set_title('Band Stop Result')    axes[13].axis('off')    plt.tight_layout()    plt.show()    return result_low, result_high

七、完整代码实现滤波

环境要求(代码亲测有效,放心使用):opencv-python、opencv-contrib-python、 numpy 、matplotlib

pip install opencv-python  opencv-contrib-python numpy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
Code:
import cv2import numpy as npimport matplotlib.pyplot as plt# 应用场景:去除随机噪声,简单平滑处理# 均值滤波def mean_filter_example(img_rgb):    # 使用3x3核    kernel_size = (33)    mean_filtered = cv2.blur(img_rgb, kernel_size)    # 使用5x5核    mean_filtered_large = cv2.blur(img_rgb, (55))    # 显示结果    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original Image')    axes[0].axis('off')    axes[1].imshow(mean_filtered)    axes[1].set_title('3x3 Mean Filter')    axes[1].axis('off')    axes[2].imshow(mean_filtered_large)    axes[2].set_title('5x5 Mean Filter')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return mean_filtered# 应用场景:去除高斯噪声,图像预处理,降采样前的平滑def gaussian_filter_example(img_rgb):    # 不同标准差的高斯滤波    gaussian_small = cv2.GaussianBlur(img_rgb, (33), 0)  # sigma=0,自动计算    gaussian_medium = cv2.GaussianBlur(img_rgb, (55), 1.0)    gaussian_large = cv2.GaussianBlur(img_rgb, (99), 2.0)    # 显示结果    fig, axes = plt.subplots(22, figsize=(1210))    axes[00].imshow(img_rgb)    axes[00].set_title('Original Image')    axes[00].axis('off')    axes[01].imshow(gaussian_small)    axes[01].set_title('Gaussian 3x3, σ=auto')    axes[01].axis('off')    axes[10].imshow(gaussian_medium)    axes[10].set_title('Gaussian 5x5, σ=1.0')    axes[10].axis('off')    axes[11].imshow(gaussian_large)    axes[11].set_title('Gaussian 9x9, σ=2.0')    axes[11].axis('off')    plt.tight_layout()    plt.show()    return gaussian_medium# 应用场景:快速平滑,积分图像计算def box_filter_example(img_rgb):    # 归一化的方框滤波(等同于均值滤波)    box_normalized = cv2.boxFilter(img_rgb, -1, (33), normalize=True)    # 非归一化的方框滤波(像素值会累积)    box_non_normalized = cv2.boxFilter(img_rgb, -1, (33), normalize=False)    box_non_normalized = np.clip(box_non_normalized / 25501)  # 归一化显示    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original Image')    axes[0].axis('off')    axes[1].imshow(box_normalized)    axes[1].set_title('Normalized Box Filter 3x3')    axes[1].axis('off')    axes[2].imshow(box_non_normalized)    axes[2].set_title('Non-Normalized Box Filter 3x3')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return box_normalized# 应用场景:去除椒盐噪声,保护边缘def median_filter_example(img_rgb):    # 添加椒盐噪声    noisy_img = img_rgb.copy()    noise_prob = 0.05    noise_mask = np.random.random(noisy_img.shape[:2]) < noise_prob    # 添加椒盐噪声    noisy_img[noise_mask] = 0  # 黑点    noisy_img[np.random.random(noisy_img.shape[:2]) < noise_prob/2] = 255  # 白点    # 应用中值滤波    median_3 = cv2.medianBlur(noisy_img.astype(np.uint8), 3)    median_5 = cv2.medianBlur(noisy_img.astype(np.uint8), 5)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(noisy_img)    axes[0].set_title('Image with Salt & Pepper Noise')    axes[0].axis('off')    axes[1].imshow(median_3)    axes[1].set_title('Median Filter 3x3')    axes[1].axis('off')    axes[2].imshow(median_5)    axes[2].set_title('Median Filter 5x5')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return median_3# 应用场景:边缘保持平滑,美颜滤镜,去噪同时保留细节def bilateral_filter_example(img_rgb):    # 双边滤波参数:d为邻域直径,sigmaColor为颜色空间标准差,sigmaSpace为坐标空间标准差    bilateral_small = cv2.bilateralFilter(img_rgb, d=9, sigmaColor=75, sigmaSpace=75)    bilateral_large = cv2.bilateralFilter(img_rgb, d=15, sigmaColor=150, sigmaSpace=150)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original Image')    axes[0].axis('off')    axes[1].imshow(bilateral_small)    axes[1].set_title('Bilateral Filter (d=9, σ=75)')    axes[1].axis('off')    axes[2].imshow(bilateral_large)    axes[2].set_title('Bilateral Filter (d=15, σ=150)')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return bilateral_small# 应用场景:边缘检测,梯度计算def sobel_filter_example(img_rgb):    # 转换为灰度图    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # Sobel算子    sobel_x = cv2.Sobel(gray, cv2.CV_64F, 10, ksize=3)    sobel_y = cv2.Sobel(gray, cv2.CV_64F, 01, ksize=3)    # 计算梯度幅值    sobel_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)    sobel_magnitude = np.uint8(255 * sobel_magnitude / np.max(sobel_magnitude))    # 计算梯度方向    sobel_direction = np.arctan2(np.abs(sobel_y), np.abs(sobel_x))    fig, axes = plt.subplots(23, figsize=(1510))    axes[00].imshow(gray, cmap='gray')    axes[00].set_title('Original Grayscale')    axes[00].axis('off')    axes[01].imshow(np.abs(sobel_x), cmap='gray')    axes[01].set_title('Sobel X')    axes[01].axis('off')    axes[02].imshow(np.abs(sobel_y), cmap='gray')    axes[02].set_title('Sobel Y')    axes[02].axis('off')    axes[10].imshow(sobel_magnitude, cmap='gray')    axes[10].set_title('Gradient Magnitude')    axes[10].axis('off')    axes[11].imshow(sobel_direction, cmap='hsv')    axes[11].set_title('Gradient Direction')    axes[11].axis('off')    # 合并X和Y    sobel_combined = cv2.addWeighted(np.abs(sobel_x), 0.5, np.abs(sobel_y), 0.50)    axes[12].imshow(sobel_combined, cmap='gray')    axes[12].set_title('Combined Sobel')    axes[12].axis('off')    plt.tight_layout()    plt.show()    return sobel_magnitude# 应用场景:更精确的边缘检测def scharr_filter_example(img_rgb):    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    scharr_x = cv2.Scharr(gray, cv2.CV_64F, 10)    scharr_y = cv2.Scharr(gray, cv2.CV_64F, 01)    scharr_magnitude = np.sqrt(scharr_x**2 + scharr_y**2)    scharr_magnitude = np.uint8(255 * scharr_magnitude / np.max(scharr_magnitude))    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(gray, cmap='gray')    axes[0].set_title('Original Grayscale')    axes[0].axis('off')    axes[1].imshow(np.abs(scharr_x), cmap='gray')    axes[1].set_title('Scharr X')    axes[1].axis('off')    axes[2].imshow(np.abs(scharr_y), cmap='gray')    axes[2].set_title('Scharr Y')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return scharr_magnitude# 应用场景:边缘检测,角点检测,图像锐化def laplacian_filter_example(img_rgb):    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 应用高斯模糊后使用Laplacian    blurred = cv2.GaussianBlur(gray, (33), 0)    # Laplacian算子    laplacian = cv2.Laplacian(blurred, cv2.CV_64F)    laplacian_abs = np.uint8(np.absolute(laplacian))    # 零交叉检测    laplacian_zero_cross = np.zeros_like(laplacian_abs)    laplacian_zero_cross[laplacian_abs > 30] = 255    fig, axes = plt.subplots(14, figsize=(205))    axes[0].imshow(gray, cmap='gray')    axes[0].set_title('Original Grayscale')    axes[0].axis('off')    axes[1].imshow(laplacian_abs, cmap='gray')    axes[1].set_title('Laplacian')    axes[1].axis('off')    axes[2].imshow(laplacian_zero_cross, cmap='gray')    axes[2].set_title('Zero Crossing (Threshold=30)')    axes[2].axis('off')    # LoG (Laplacian of Gaussian)    log_kernel = np.array([[010],                          [1, -41],                          [010]], dtype=np.float32)    log_filtered = cv2.filter2D(blurred, -1, log_kernel)    axes[3].imshow(np.abs(log_filtered), cmap='gray')    axes[3].set_title('LoG Filtered')    axes[3].axis('off')    plt.tight_layout()    plt.show()    return laplacian_abs# 应用场景:精确边缘检测,计算机视觉预处理def canny_edge_detection(img_rgb):    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 不同阈值的Canny检测    canny_low = cv2.Canny(gray, 50150)    canny_medium = cv2.Canny(gray, 100200)    canny_high = cv2.Canny(gray, 150250)    # 自适应Canny    median_intensity = np.median(gray)    lower_thresh = int(max(00.7 * median_intensity))    upper_thresh = int(min(2551.3 * median_intensity))    canny_adaptive = cv2.Canny(gray, lower_thresh, upper_thresh)    fig, axes = plt.subplots(23, figsize=(1510))    axes[00].imshow(gray, cmap='gray')    axes[00].set_title('Original Grayscale')    axes[00].axis('off')    axes[01].imshow(canny_low, cmap='gray')    axes[01].set_title('Canny (50, 150)')    axes[01].axis('off')    axes[02].imshow(canny_medium, cmap='gray')    axes[02].set_title('Canny (100, 200)')    axes[02].axis('off')    axes[10].imshow(canny_high, cmap='gray')    axes[10].set_title('Canny (150, 250)')    axes[10].axis('off')    axes[11].imshow(canny_adaptive, cmap='gray')    axes[11].set_title(f'Adaptive Canny ({lower_thresh}, {upper_thresh})')    axes[11].axis('off')    axes[12].axis('off')    plt.tight_layout()    plt.show()    return canny_medium# 应用场景:图像去噪,细节增强,HDR压缩def guided_filter_example(img_rgb):    """导向滤波实现"""    # 转换为浮点型    guide = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY).astype(np.float32) / 255.0    src = guide.copy()    # OpenCV中的导向滤波    guided = cv2.ximgproc.guidedFilter(guide=guide, src=src, radius=5, eps=0.01)    # 与双边滤波比较    bilateral = cv2.bilateralFilter((guide * 255).astype(np.uint8), 97575)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(guide, cmap='gray')    axes[0].set_title('Original')    axes[0].axis('off')    axes[1].imshow(guided, cmap='gray')    axes[1].set_title('Guided Filter')    axes[1].axis('off')    axes[2].imshow(bilateral, cmap='gray')    axes[2].set_title('Bilateral Filter')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return guided# 应用场景:高质量图像去噪,医学图像处理def non_local_means_denoising(img_rgb):    """非局部均值去噪"""    # 添加高斯噪声    noisy = img_rgb.copy().astype(np.float32) / 255.0    noise = np.random.normal(00.1, noisy.shape)    noisy_with_gaussian = np.clip(noisy + noise, 01)    # 转换为uint8    noisy_uint8 = (noisy_with_gaussian * 255).astype(np.uint8)    # 应用非局部均值去噪    denoised = cv2.fastNlMeansDenoisingColored(noisy_uint8, None,                                                 h=10, hColor=10,                                                templateWindowSize=7,                                                searchWindowSize=21)    fig, axes = plt.subplots(13, figsize=(155))    axes[0].imshow(img_rgb)    axes[0].set_title('Original')    axes[0].axis('off')    axes[1].imshow(noisy_uint8)    axes[1].set_title('With Gaussian Noise')    axes[1].axis('off')    axes[2].imshow(denoised)    axes[2].set_title('Non-Local Means Denoised')    axes[2].axis('off')    plt.tight_layout()    plt.show()    return denoised# 应用场景:二值图像处理,形状分析,噪声去除def morphological_filters(img_rgb):    """形态学滤波"""    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 创建二值图像用于演示    _, binary = cv2.threshold(gray, 127255, cv2.THRESH_BINARY)    # 结构元素    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (55))    # 腐蚀    erosion = cv2.erode(binary, kernel, iterations=1)    # 膨胀    dilation = cv2.dilate(binary, kernel, iterations=1)    # 开运算(先腐蚀后膨胀)    opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)    # 闭运算(先膨胀后腐蚀)    closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)    # 形态学梯度    gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel)    fig, axes = plt.subplots(23, figsize=(1510))    axes[00].imshow(binary, cmap='gray')    axes[00].set_title('Binary Image')    axes[00].axis('off')    axes[01].imshow(erosion, cmap='gray')    axes[01].set_title('Erosion')    axes[01].axis('off')    axes[02].imshow(dilation, cmap='gray')    axes[02].set_title('Dilation')    axes[02].axis('off')    axes[10].imshow(opening, cmap='gray')    axes[10].set_title('Opening')    axes[10].axis('off')    axes[11].imshow(closing, cmap='gray')    axes[11].set_title('Closing')    axes[11].axis('off')    axes[12].imshow(gradient, cmap='gray')    axes[12].set_title('Morphological Gradient')    axes[12].axis('off')    plt.tight_layout()    plt.show()    return opening, closing# 应用场景:医学图像处理,边缘保持平滑,纹理分析def anisotropic_diffusion(img_rgb):    """各向异性扩散滤波"""    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY).astype(np.float32)    # 简单的Perona-Malik各向异性扩散实现    def perona_malik_diffusion(img, iterations=10, kappa=50, gamma=0.1):        img_diffused = img.copy()        for _ in range(iterations):            # 计算梯度            grad_north = np.roll(img_diffused, -1, axis=0) - img_diffused            grad_south = np.roll(img_diffused, 1, axis=0) - img_diffused            grad_east = np.roll(img_diffused, -1, axis=1) - img_diffused            grad_west = np.roll(img_diffused, 1, axis=1) - img_diffused            # 扩散系数            c_north = 1.0 / (1.0 + (grad_north / kappa)**2)            c_south = 1.0 / (1.0 + (grad_south / kappa)**2)            c_east = 1.0 / (1.0 + (grad_east / kappa)**2)            c_west = 1.0 / (1.0 + (grad_west / kappa)**2)            # 更新图像            img_diffused += gamma * (c_north * grad_north +                                     c_south * grad_south +                                     c_east * grad_east +                                     c_west * grad_west)        return img_diffused    # 应用各向异性扩散    diffused = perona_malik_diffusion(gray, iterations=20, kappa=30, gamma=0.1)    fig, axes = plt.subplots(12, figsize=(126))    axes[0].imshow(gray, cmap='gray')    axes[0].set_title('Original Grayscale')    axes[0].axis('off')    axes[1].imshow(diffused, cmap='gray')    axes[1].set_title('Anisotropic Diffusion')    axes[1].axis('off')    plt.tight_layout()    plt.show()    return diffused# 应用场景:频域分析,周期性噪声去除,图像增强def frequency_domain_filtering(img_rgb):    """频域滤波"""    gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)    # 傅里叶变换    dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)    dft_shift = np.fft.fftshift(dft)    # 创建滤波器    rows, cols = gray.shape    crow, ccol = rows // 2, cols // 2    # 低通滤波器    mask_low = np.zeros((rows, cols, 2), np.uint8)    r = 30    mask_low[crow-r:crow+r, ccol-r:ccol+r] = 1    # 高通滤波器    mask_high = np.ones((rows, cols, 2), np.uint8)    r = 30    mask_high[crow-r:crow+r, ccol-r:ccol+r] = 0    # 带阻滤波器    mask_band = np.ones((rows, cols, 2), np.uint8)    r_outer = 60    r_inner = 20    cv2.circle(mask_band, (ccol, crow), r_outer, 0, -1)    cv2.circle(mask_band, (ccol, crow), r_inner, 1, -1)    # 应用滤波    fshift_low = dft_shift * mask_low    fshift_high = dft_shift * mask_high    fshift_band = dft_shift * mask_band    # 逆变换    def inverse_transform(fshift):        f_ishift = np.fft.ifftshift(fshift)        img_back = cv2.idft(f_ishift)        img_back = cv2.magnitude(img_back[:,:,0], img_back[:,:,1])        return cv2.normalize(img_back, None, 0255, cv2.NORM_MINMAX)    result_low = inverse_transform(fshift_low)    result_high = inverse_transform(fshift_high)    result_band = inverse_transform(fshift_band)    fig, axes = plt.subplots(24, figsize=(168))    # 显示原图和频谱    magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]) + 1)    axes[00].imshow(gray, cmap='gray')    axes[00].set_title('Original')    axes[00].axis('off')    axes[01].imshow(magnitude_spectrum, cmap='gray')    axes[01].set_title('Magnitude Spectrum')    axes[01].axis('off')    axes[02].imshow(mask_low[:,:,0], cmap='gray')    axes[02].set_title('Low Pass Filter')    axes[02].axis('off')    axes[03].imshow(result_low, cmap='gray')    axes[03].set_title('Low Pass Result')    axes[03].axis('off')    axes[10].imshow(mask_high[:,:,0], cmap='gray')    axes[10].set_title('High Pass Filter')    axes[10].axis('off')    axes[11].imshow(result_high, cmap='gray')    axes[11].set_title('High Pass Result')    axes[11].axis('off')    axes[12].imshow(mask_band[:,:,0], cmap='gray')    axes[12].set_title('Band Stop Filter')    axes[12].axis('off')    axes[13].imshow(result_band, cmap='gray')    axes[13].set_title('Band Stop Result')    axes[13].axis('off')    plt.tight_layout()    plt.show()    return result_low, result_highdef run_all_filters(img_rgb):    """运行所有滤波示例"""    print("开始执行所有滤波算法示例...")    # 基本线性滤波    print("\n1. 均值滤波示例...")    mean_result = mean_filter_example(img_rgb)    print("\n2. 高斯滤波示例...")    gaussian_result = gaussian_filter_example(img_rgb)    print("\n3. 方框滤波示例...")    box_result = box_filter_example(img_rgb)     # 非线性滤波    print("\n4. 中值滤波示例...")    median_result = median_filter_example(img_rgb)    print("\n5. 双边滤波示例...")    bilateral_result = bilateral_filter_example(img_rgb)     # 边缘检测    print("\n6. Sobel算子示例...")    sobel_result = sobel_filter_example(img_rgb)    print("\n7. Laplacian算子示例...")    laplacian_result = laplacian_filter_example(img_rgb)    print("\n8. Canny边缘检测示例...")    canny_result = canny_edge_detection(img_rgb)     # 高级滤波    print("\n10. 导向滤波示例...")    guided_result = guided_filter_example(img_rgb)    print("\n11. 非局部均值去噪示例...")    nlm_result = non_local_means_denoising(img_rgb)    print("\n12. 形态学滤波示例...")    morph_result = morphological_filters(img_rgb)    print("\n13. 频域滤波示例...")    freq_result = frequency_domain_filtering(img_rgb)    return Trueif __name__ == "__main__":    img_rgb = cv2.imread('data/datasets/JPEGImages/00F75605333_0730135838385.jpg')    img_rgb = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2RGB)    # 运行所有示例    run_all_filters(img_rgb)

八、滤波算法选择指南

8.1 根据应用场景选择滤波算法

应用场景推荐算法优点缺点
去除高斯噪声
高斯滤波、非局部均值
效果好,计算相对简单
可能模糊边缘
去除椒盐噪声
中值滤波
有效去除孤立的噪声点
可能丢失细节
边缘保持去噪
双边滤波、导向滤波
保留边缘信息
计算复杂度高
边缘检测
Canny、Sobel
检测精度高
对噪声敏感
图像锐化
Laplacian、自定义锐化核
增强细节
可能放大噪声
纹理分析
Gabor滤波
方向选择性好
参数调整复杂
医学图像处理
各向异性扩散、非局部均值
保持重要结构
计算时间长
实时处理
均值滤波、方框滤波
计算速度快
效果一般

8.2 参数调优建议

  1. 1. 核大小选择
    • • 小核(3×3):保留细节,去噪能力弱
    • • 中核(5×5-7×7):平衡细节保留和去噪
    • • 大核(>7×7):强去噪,可能过度模糊
  2. 2. 标准差设置(高斯滤波):
    • • σ ≈ 核大小/6 效果较好
    • • 小σ:强调中心像素
    • • 大σ:更均匀的平滑
  3. 3. 迭代次数
    • • 中值滤波:通常1-2次
    • • 形态学操作:根据需求调整
    • • 各向异性扩散:10-50次

总结

OpenCV提供了丰富的滤波算法,从基本的线性滤波到高级的非线性滤波,每种算法都有其特定的应用场景。选择合适的滤波算法需要考虑:

  1. 1. 噪声类型:高斯噪声、椒盐噪声、周期性噪声等
  2. 2. 处理目标:去噪、边缘检测、特征增强等
  3. 3. 性能要求:实时性、计算资源限制等
  4. 4. 图像特性:纹理、边缘密度、对比度等

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 18:01:46 HTTP/2.0 GET : https://f.mffb.com.cn/a/464447.html
  2. 运行时间 : 0.119725s [ 吞吐率:8.35req/s ] 内存消耗:5,033.73kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a2c359584a4517498ee007082fa9ee90
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000838s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001635s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000654s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000553s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001219s ]
  6. SELECT * FROM `set` [ RunTime:0.000473s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001215s ]
  8. SELECT * FROM `article` WHERE `id` = 464447 LIMIT 1 [ RunTime:0.001088s ]
  9. UPDATE `article` SET `lasttime` = 1770544906 WHERE `id` = 464447 [ RunTime:0.014354s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000611s ]
  11. SELECT * FROM `article` WHERE `id` < 464447 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001105s ]
  12. SELECT * FROM `article` WHERE `id` > 464447 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003713s ]
  13. SELECT * FROM `article` WHERE `id` < 464447 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001996s ]
  14. SELECT * FROM `article` WHERE `id` < 464447 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001670s ]
  15. SELECT * FROM `article` WHERE `id` < 464447 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001831s ]
0.123018s