Haar小波基是由Alfréd Haar在1910年提出的,它是最早的正交小波,也是为数不多的具有对称性和有限支撑的正交小波之一。Haar小波函数是定义在有限区间上的函数,通常是半开区间[0,1)上,它们在一个小范围内取值为1或-1,而在其他区域为0。由于其在时域是紧支撑的,即其非零区间有限,这使得Haar小波在实际应用中具有一定的优势。
Haar小波的母小波(mother wavelet)Ψ(x)定义如下:
对应的尺度函数(scaling function)ϕ(x)定义如下:
Haar小波的滤波器h[n]定义为:
Haar小波具有以下特点:
- 在时域是紧支撑的,即其非零区间为[0,1)。
- 属于正交小波,这意味着不同尺度或平移版本的Haar小波函数之间是正交的。
- 是对称的,这使得它在处理对称性问题时有一定的优势。
- 仅取+1和-1,计算简单,这使得Haar小波在计算上非常高效。
- 是不连续小波,在实际的信号分析与处理中受到了限制,因为它不能很好地逼近连续信号。
Haar 小波滤波器:定义两个一维滤波器 h
和 g
,分别对应于低通滤波器和高通滤波器。低通滤波器 h
用于捕捉图像的近似信息,而高通滤波器 g
用于捕捉图像的细节信息,即边缘。
h = [1/sqrt(2), 1/sqrt(2)]; % 低通滤波器
g = [1/sqrt(2), -1/sqrt(2)]; % 高通滤波器
卷积操作:使用 conv2
函数将图像 I
与这两个滤波器进行卷积操作。conv2
函数对图像进行二维卷积,'same'
选项确保输出图像与输入图像大小相同。卷积操作后,a
表示近似系数,它包含了图像的低频信息;d
表示细节系数,它包含了图像的高频信息,即边缘。
a = conv2(double(I), h, 'same');
d = conv2(double(I), g, 'same');
边缘强度计算:通过计算细节系数 d
以及其在水平和垂直方向上位移一个像素后的值的平方和的平方根,来计算边缘强度。这个操作实际上是在检测图像中每个像素点及其邻居之间的强度变化,变化越大,边缘越明显。
edges = sqrt(d.^2 + (circshift(d, [-1, 0])).^2 + (circshift(d, [0, -1])).^2);
二值化:通过设置一个阈值(通常是边缘强度最大值的一个比例)来将边缘强度图转换为二值图像。阈值以上的像素点被认为是边缘,设置为 1(或 True),否则设置为 0(或 False)。
threshold = 0.2 * max(edges(:));
edges = edges > threshold;
完整代码:
%读取图像并转换为灰度图
I = imread('lena.png');
I = rgb2gray(I);
% 执行边缘检测
edgesCustom = haarEdgeDetectionCustom(I);
edgesToolbox = haarEdgeDetectionToolbox(I);
% 使用subplot展示结果
figure;
subplot(1,3,1); imshow(I); title('原始图像');
subplot(1,3,2); imshow(edgesCustom); title('自定义haar小波图像边缘检测');
subplot(1,3,3); imshow(edgesToolbox); title('工具箱haar小波图像边缘检测');
% 自定义Haar小波进行边缘检测
function edges = haarEdgeDetectionCustom(I)
% Haar小波滤波器
h = [1/sqrt(2), 1/sqrt(2)]; % 低通滤波器
g = [1/sqrt(2), -1/sqrt(2)]; % 高通滤波器
% 近似和细节系数
a = conv2(double(I), h, 'same');
d = conv2(double(I), g, 'same');
% 边缘强度
edges = sqrt(d.^2 + (circshift(d, [-1, 0])).^2 + (circshift(d, [0, -1])).^2);
% 二值化
threshold = 0.2 * max(edges(:));
edges = edges > threshold;
end
% MATLAB工具箱中的Haar小波进行边缘检测
function edges = haarEdgeDetectionToolbox(I)
% 小波分解
[C, S] = wavedec2(I, 1, 'haar');
% 提取细节系数
[H, V, D] = detcoef2('all', C, S, 1);
% 边缘强度
edges = sqrt(H.^2 + V.^2 + D.^2);
% 二值化
threshold = 0.2 * max(edges(:));
edges = edges > threshold;
end
可以调整参数以达到获取更多边缘特征的效果,这里阈值设置为边缘强度最大值的 20%