为了对比不同小波基对图像边缘检测的影响,笔者这里随便找了五个小波基进行实验
-
Haar小波(haar):
- 优势:计算简单,实现快速,适合实时或计算资源受限的应用场景。
- 局限性:由于其阶梯形状的波形,Haar小波在边缘检测时可能不够精确,容易产生阶梯效应,且对噪声的鲁棒性较差。
-
Daubechies小波(db2):
- 优势:具有较好的时频局部化特性,能有效捕捉图像中的高频信息,适合边缘检测。消失矩的特性使其在去除噪声的同时保留边缘信息。
- 局限性:与Haar小波相比,计算复杂度稍高,但在实际应用中通常可以接受。
-
Symlets小波(sym2):
- 优势:相比于Daubechies小波,Symlets小波具有更好的对称性,这使得它们在处理图像时能提供更清晰的边缘定位和更少的伪影。
- 局限性:与Daubechies小波相似,计算复杂度较高,但在对称性要求较高的应用中表现更好。
-
Coiflets小波(coif2):
- 优势:Coiflets小波的设计目标是最大化对称性和正交性,这使得它们在处理具有光滑性质的图像时非常有用,尤其是在边缘检测中能提供较平滑的过渡。
- 局限性:与Symlets小波类似,计算复杂度较高,但在需要高度对称性的应用中表现优异。
-
Biorthogonal小波(bior2.2):
- 优势:Biorthogonal小波允许可分离的双正交滤波器设计,这使得它们在图像压缩和边缘检测中非常有用。它们通常能提供较好的方向选择性和多尺度分析能力。
- 局限性:Biorthogonal小波的计算复杂度通常高于正交小波,且在某些情况下可能需要更多的存储空间来处理双正交性。
通过使用五种不同的小波基进行边缘检测,笔者发现通过肉眼很难观测出边缘检测效果的差异(可能是参数调整的问题),为此笔者希望通过一些评价指标的数据来判断不同小波基的效果差异。但是边缘检测出来的都是边缘特征,不能够直接与原图进行对比(只能边缘和边缘进行对比,即同类对比),但是大部分图像的原始边缘是没有给出或者是说没有标准的对比对象。
笔者想到两种方法,第一种是直接找一些边缘的图片,然后加上背景,再进行边缘检测,最后与之前找的边缘图片进行对比,得出评价指标。但是这种方法对于大部分图像是不适用的。
笔者想出的第二种方法是将一种比较好的边缘检测方法所检测到的边缘作为原始边缘,然后与运用小波变换边缘检测进行处理之后的图片进行对比,得出评价指标。本文采用第二种方法。
本文采用canny算子进行边缘检测的结果作为参照,当然也可以根据情况采用其他算子。
评价指标的选择:
RMSE(Root Mean Square Error,均方根误差): RMSE是衡量两幅图像之间差异的一种方法。它通过计算两幅图像对应像素值差的平方的平均值,然后取平方根得到。RMSE值越小,表示两幅图像之间的差异越小,图像质量越好。数学上,对于两幅大小相同的图像,RMSE计算公式为:
PSNR(Peak Signal-to-Noise Ratio,峰值信噪比): PSNR是衡量图像质量的另一个指标,它通过比较原始图像和失真图像来衡量图像恢复质量。PSNR是基于MSE(均方误差)计算的,表示原始图像与失真图像之间的最大可能功率比。PSNR值越高,表示图像质量越好。PSNR的计算公式为:
SSIM(Structural Similarity Index Measure,结构相似性指数): SSIM是一个更先进的图像质量评估指标,它考虑了图像的亮度、对比度和结构信息。SSIM的值范围在-1到1之间,值越接近1,表示两幅图像的结构相似度越高,图像质量越好。SSIM不仅考虑了像素值的差异,还考虑了图像的纹理和轮廓信息,因此在评估图像质量时更加全面和准确。SSIM的计算公式为:
完整代码:
clc, clear;
X = imread('lena.png');
X1 = rgb2gray(X);
X2 = edge(X1,'canny',[ 0.05 0.2]);
% 将X2转换为uint8数据类型
X2 = uint8(X2 * 255);
% 小波基列表
waveletNames = {'haar', 'db2', 'sym2', 'coif2', 'bior2.2'};
numImages = length(waveletNames) + 1;
figure;
subplot(2, 3, 1);
imshow(X1, []);
title('原始图像');
% 循环遍历不同的小波基
for i = 1:length(waveletNames)
waveletName = waveletNames{i};
level = 1;
% 开始计时
tic;
% 小波分解
[C, S] = wavedec2(X1, level, waveletName);
% 提取细节系数(水平、垂直、对角线)
[H, V, D] = detcoef2('all', C, S, level);
% 边缘检测 - 利用小波细节系数
edge_image = sqrt(H.^2 + V.^2 + D.^2);
% 将edge_image转换为uint8数据类型
edge_image = uint8(edge_image);
% 形态学操作 - 膨胀和腐蚀
se = strel('disk', 1);
edge_image_dilated = imdilate(edge_image, se);
edge_image_eroded = imerode(edge_image_dilated, se);
% 确保边缘图像与Canny结果尺寸相同
if ~isequal(size(edge_image_eroded), size(X2))
edge_image_eroded = imresize(edge_image_eroded, size(X2));
end
% 停止计时并计算时间
timeTaken = toc;
% 使用subplot显示结果
subplot(2, 3, i+1);
imshow(edge_image_eroded, []);
title(['小波变换边缘检测 - ', waveletName, ' (', num2str(timeTaken), ' 秒)']);
% 计算RMSE
rmse = sqrt(mean((double(edge_image_eroded(:)) - double(X2(:))).^2));
% 计算PSNR
psnr = 10 * log10(255^2 / var(double(edge_image_eroded(:)) - double(X2(:))));
% 计算SSIM
[ssimValue, ssimMap] = ssim(edge_image_eroded, X2);
% 在图片下方显示指标
text(0, -0.1, sprintf('RMSE: %.4f\nPSNR: %.4f dB\nSSIM: %.4f', rmse, psnr, ssimValue), ...
'Units', 'normalized', 'HorizontalAlignment', 'left', 'VerticalAlignment', 'top', ...
'FontSize', 8, 'FontWeight', 'bold');
% 显示指标
fprintf('小波基: %s\n', waveletName);
fprintf('RMSE: %.4f\n', rmse);
fprintf('PSNR: %.4f dB\n', psnr);
fprintf('SSIM: %.4f\n', ssimValue);
end
根据笔者自己做实验所选择的几幅图像(lena,lock图,医学影响,文字识别,纹理细节特别多的人像),笔者得出结论:
haar
小波基在多个测试图像中的表现良好,而oif2
小波基在大多数情况下表现较差,但这些结论是基于特定数据集的评估,不同的数据集可能会有不同的结果。