1.小波变换压缩
设计思路
小波变换压缩的设计思路是利用小波变换对图像进行多级分解,从而在不同的分辨率层次上捕捉图像的特征。通过仅保留重要的小波系数(通常是低频系数),并且去除或减少不重要的高频系数,实现图像数据的压缩,同时尽量保留图像的主要视觉信息。
实现方法
具体实现上,首先选择合适的小波基(如sym3)和分解层数进行小波变换,获取图像的多级小波系数。然后根据压缩需求选择保留哪些系数,通常保留低频系数并压缩或舍弃部分高频系数。最后,使用量化和编码技术处理保留的系数以进一步减少数据量,完成压缩过程。
Matlab代码
close all; clc; clear;
% 读取并转换图像
data = imread('G.png');
data = rgb2gray(data);
% 显示原始图像
figure;
subplot(1,3,1);
imshow(data);
info = whos('data');
title(['原始图像,大小: ' num2str(info.bytes) ' bytes']);
% 进行一级小波分解
[c,s] = wavedec2(data, 1, 'sym3');
cA1 = appcoef2(c, s, 'sym3', 1); % 一级低频系数
cA1 = wcodemat(cA1, 192, 'mat', 0);
cA1 = uint8(cA1);
% 显示一级压缩图像
subplot(1,3,2);
imshow(cA1);
info = whos('cA1');
title(['一级压缩图像,大小: ' num2str(info.bytes) ' bytes']);
% 进行二级小波分解
[c,s] = wavedec2(data, 2, 'sym3');
cA2 = appcoef2(c, s, 'sym3', 2); % 二级低频系数
cA2 = wcodemat(cA2, 192, 'mat', 0);
cA2 = uint8(cA2);
% 显示二级压缩图像
subplot(1,3,3);
imshow(cA2);
info = whos('cA2');
title(['二级压缩图像,大小: ' num2str(info.bytes) ' bytes']);
效果
2.小波变换加上数字水印
设计思路
通过小波变换对图像进行多级分解,将数字水印嵌入到图像的高频部分中。这种方法利用了人眼对高频细节(如图像边缘和纹理)的不敏感特性,保持了图像的视觉质量。
实现方法
首先,选择适合的小波基和分解层数对原始图像执行小波分解。然后,将数字水印调整到适当的大小并嵌入到小波分解得到的高频系数中。嵌入水印后,使用逆小波变换重构图像,完成水印的嵌入。通过相同的小波分解,可以从修改过的图像中提取和恢复水印信息。
Matlab代码
clear all; close all; clc;
% 读取和准备图像
I = imread('G.png');
Ig = rgb2gray(I); % 转换为灰度图
% 读取水印图像
W = imread('shuiyin.png');
Wg = rgb2gray(W);
Wg = double(Wg);
% 执行两级小波分解
[cA1, cH1, cV1, cD1] = dwt2(Ig, 'sym3');
[cA2, cH2, cV2, cD2] = dwt2(cA1, 'sym3');
% 自动调整水印大小以匹配第二级高频部分cH2的大小
W_resized = imresize(Wg, size(cH2));
% 在第二级分解的右上角嵌入水印
cH2 = cH2 - W_resized;
% 重构图像
i_c2 = idwt2(cA2, cH2, cV2, cD2, 'sym3'); % 第二级重构
% 调整 i_c2 的大小以适配 cH1 的尺寸
i_c2_resized = imresize(i_c2, size(cH1));
img_w = idwt2(i_c2_resized, cH1, cV1, cD1, 'sym3'); % 完全重构
% 显示结果
figure;
subplot(1,3,1);
imshow(Ig, []);
title('Original Image');
subplot(1,3,2);
imshow(img_w, []);
title('Watermarked Image');
subplot(1,3,3);
imshow(Wg, []);
title('Watermark in HL2');
效果
3. Sobel,Roberts,Prewitt算子边缘检测
设计思路
边缘检测算法通过检测图像亮度的快速变化来识别对象的边缘。Sobel,Roberts和Prewitt算子都是通过卷积核对图像进行滤波,分别提取水平和垂直方向的边缘,从而增强图像中的边缘信息。这些算子设计的核心是强调图像中的高频部分,即边缘区域,而抑制低频部分,即平滑区域。
实现方法
- Sobel算子:利用两个方向的卷积核(水平和垂直)来增强图像的水平和垂直边缘。其核强调中心行或列,对边缘响应较为敏感。
- Roberts算子:采用对角线方向的小型卷积核,适用于高精度的边缘检测。它计算对角线差异,简单且对噪声较敏感。
- Prewitt算子:与Sobel类似,但在卷积核中对所有邻近像素的权重相同,这使其在处理边缘时更为柔和。
Matlab代码
% 读取图像并转换为灰度图
I = imread('G.png');
I_gray = rgb2gray(I);
% Sobel算子核
Sx = [-1 0 1; -2 0 2; -1 0 1];
Sy = [-1 -2 -1; 0 0 0; 1 2 1];
% Roberts算子核
Rx = [1 0; 0 -1];
Ry = [0 1; -1 0];
% Prewitt算子核
Px = [-1 0 1; -1 0 1; -1 0 1];
Py = [-1 -1 -1; 0 0 0; 1 1 1];
% 进行边缘检测
BW_Sobel = abs(imfilter(I_gray, Sx)) + abs(imfilter(I_gray, Sy));
BW_Roberts = abs(imfilter(I_gray, Rx)) + abs(imfilter(I_gray, Ry));
BW_Prewitt = abs(imfilter(I_gray, Px)) + abs(imfilter(I_gray, Py));
% 显示结果
figure;
subplot(2,2,1), imshow(I_gray), title('原图');
subplot(2,2,2), imshow(BW_Sobel), title('Sobel');
subplot(2,2,3), imshow(BW_Roberts), title('Roberts');
subplot(2,2,4), imshow(BW_Prewitt), title('Prewitt');
效果
4. 小波变换边缘检测
设计思路
小波变换通过多尺度分析对图像进行分解,利用其高频子带来捕捉图像中的边缘信息。通过提取和处理水平、垂直和对角线方向的高频分量,可以有效地检测图像中的边缘。
实现方法
首先,对图像进行二维离散小波变换,将其分解为低频和高频子带。然后,通过阈值处理高频子带,提取边缘信息,并将其二值化以突出显示。最终,将各方向的边缘信息合并,得到完整的边缘检测结果。
Matlab代码
close all; clc; clear;
% 读取图像
I = imread('G.png');
I_gray = rgb2gray(I);
% 选择一个小波基
waveletFunction = 'haar';
% 执行二维小波分解,这里我们使用两层分解
[CA, CH, CV, CD] = dwt2(I_gray, waveletFunction);
% 边缘通常出现在高频子带,因此我们可以检测水平、垂直和对角高频子带
% 采用阈值处理提取边缘
edge_CH = wthresh(CH,'s',0.2*max(CH(:)));
edge_CV = wthresh(CV,'s',0.2*max(CV(:)));
edge_CD = wthresh(CD,'s',0.2*max(CD(:)));
% 二值化处理,突出显示边缘
BW_CH = imbinarize(edge_CH);
BW_CV = imbinarize(edge_CV);
BW_CD = imbinarize(edge_CD);
% 合并边缘信息
BW_edges = BW_CH | BW_CV | BW_CD;
% 显示结果
figure;
subplot(2,3,1), imshow(I_gray), title('原图');
subplot(2,3,2), imshow(BW_CH), title('水平边缘');
subplot(2,3,3), imshow(BW_CV), title('垂直边缘');
subplot(2,3,4), imshow(BW_CD), title('对角边缘');
subplot(2,3,5), imshow(BW_edges), title('结合');