Skip to content

MATLAB - 高斯-拉普拉斯滤波

MATLAB - 用于边缘检测的高斯-拉普拉斯 (LoG) 滤波器

Section titled “MATLAB - 用于边缘检测的高斯-拉普拉斯 (LoG) 滤波器”

高斯-拉普拉斯 (LoG) 滤波器是一种强大的图像处理滤波器,用于检测边缘。它将两个步骤合二为一:首先使用高斯滤波器平滑图像以减少噪声,然后应用拉普拉斯滤波器来查找强度快速变化的区域(即边缘)。

LoG 被称为二阶导数算子。图像中的边缘对应于滤波输出中的过零点(像素值从正变为负)。通过调整高斯分量的 sigma(标准差),您可以在不同尺度下检测边缘——较小的 sigma 可以找到精细细节,而较大的 sigma 则可以找到更宽、更显著的边缘。

虽然 MATLAB 有一个旧版函数 fspecial('log'),但更现代、更具教学意义的方法是自己创建滤波器核。这使您能够完全控制并更好地理解整个过程。

示例 1:手动创建和应用 LoG 滤波器

Section titled “示例 1:手动创建和应用 LoG 滤波器”
%% 1. 加载并准备图像
originalImage = imread('peppers.png');
grayImage = rgb2gray(originalImage);
% 转换为双精度浮点数以进行精确计算
doubleImage = double(grayImage);
%% 2. 定义 LoG 滤波器参数
% Sigma 控制要检测的边缘尺度
sigma = 2.0;
% 根据 sigma 确定滤波器大小(经验法则)
filterSize = 2 * ceil(3 * sigma) + 1;
%% 3. 创建 LoG 滤波器核
% 创建 (x,y) 坐标网格
[X, Y] = meshgrid(-floor(filterSize/2):floor(filterSize/2));
% 高斯-拉普拉斯公式
logKernel = -1 / (pi * sigma^4) * (1 - (X.^2 + Y.^2) / (2 * sigma^2)) .* exp(-(X.^2 + Y.^2) / (2 * sigma^2));
% 最佳实践:归一化滤波器核,使其和为零,以作为拉普拉斯算子
logKernel = logKernel - mean(logKernel(:));
%% 4. 应用滤波器
% 'replicate' 通过复制边缘像素值来处理边界像素
filteredImage = imfilter(doubleImage, logKernel, 'replicate');
%% 5. 显示结果
figure;
subplot(1, 2, 1);
imshow(grayImage);
title('Original Grayscale Image');
% LoG 输出突出边缘。我们使用空的颜色图范围 `[]`
% 自动调整显示比例以显示正负值。
subplot(1, 2, 2);
imshow(filteredImage, []);
title(sprintf('LoG Filtered (Sigma = %.1f)', sigma));
  • 滤波器创建:我们首先创建一个坐标网格 (meshgrid)。然后,我们将二维 LoG 函数的数学公式应用于此网格。这会创建一个代表滤波器的核(一个小型矩阵)。
  • 归一化:对于二阶导数滤波器来说,关键一步是确保滤波器核的元素之和为零。这保证了滤波器在图像的平坦、均匀区域没有响应,只在强度变化处产生响应。
  • 滤波:imfilter 使用我们自定义的 logKernel 对图像进行卷积。我们使用 'replicate' 选项来避免零填充导致的暗边。
  • 显示:LoG 滤波器的输出包含正值、负值和零值。为了正确可视化,imshow(filteredImage, []) 会自动调整显示范围以适应数据,通常将正值显示为白色,负值显示为黑色,过零点(即边缘)显示为灰色。

输出窗口将显示原始图像在左侧。右侧的滤波后图像将大部分是灰色。原始图像中的强边缘将显示为锐利、细致的双线(一条黑色,一条白色)。这种从黑到白的过渡代表过零点,它精确地定位了边缘。

为了快速测试或处理旧代码,您仍然可以使用 fspecial。它的灵活性较差但更简洁。

示例 2:简单拉普拉斯滤波器与 LoG 滤波器的比较

Section titled “示例 2:简单拉普拉斯滤波器与 LoG 滤波器的比较”

此示例突出了 LoG 中高斯平滑的重要性。纯拉普拉斯滤波器对噪声非常敏感。

I = imread('cameraman.tif');
% 1. 简单拉普拉斯滤波器(对噪声敏感)
h_lap = fspecial('laplacian', 0.2); % 0.2 is the alpha parameter
I_lap = imfilter(I, h_lap, 'replicate');
% 2. 高斯-拉普拉斯 (LoG) 滤波器(抗噪声)
h_log = fspecial('log', [5 5], 0.5); % 5x5 filter, sigma=0.5
I_log = imfilter(I, h_log, 'replicate');
% 显示比较结果
figure;
subplot(1, 3, 1); imshow(I); title('Original');
subplot(1, 3, 2); imshow(I_lap, []); title('Laplacian Only');
subplot(1, 3, 3); imshow(I_log, []); title('Laplacian of Gaussian');

一个图窗将显示三幅图像。‘Original’ 是输入图像。‘Laplacian Only’ 图像将显示边缘,但图像中也会有很多斑点噪声。‘Laplacian of Gaussian’ 图像将具有更清晰、更明显的边缘,背景噪声被抑制,这表明了初始高斯平滑的有效性。