图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解 释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
拉普拉斯金字塔:用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。拉普拉斯金字塔中 的图像可用对高斯金字塔中相邻两层图象的相减而近似得到。需先将图像在较粗的尺度(较高的层次)上扩展。扩展比减少尺寸的压缩困难,因为缺少的信息需要通过插值来得到。
如果第 j 级图像表示为 imj(x, y),第 j − 1 级图像为 im(j − 1)(x, y),可以通过以下的计算方式得到:
步骤 1:首先进行高斯低通滤波,按照课本中的内容,这次滤波使用空域中对应的高斯低通滤波器。
步骤 2:通过滤波可以得到近似图像,之后对图像进行以 2 位基的下采样。步骤 3:重复上面的操作。依次可以得到各个低阶图像。
获得残差金字塔的方法是,利用低一阶的图像进行插值复原,也就是以 2 为基的上采样。计算步骤如下:
步骤 1:首先通过线性插值得到完成上采样的图像。
步骤 2:利用上一级的图像与其相减,得到图像之差,即为本阶的残差图像步骤 3:重复上面的操作。依次可以得到各阶残差图像。
主函数:
%% 运行 exp73.m 获得图像金字塔
clc;
clear;
close all;
%% 课本图 7.3
% 读取图片
im = imread('demo-1.jpg'); % 原始图像 uint8
% 得到图像的行数、列数、以及每像素的维数(防止出现RGB图像)
[line,row,v]=size(im);
im = im(:,:,1);
%% 近似金字塔 使用空域的高斯的低通滤波 两倍下采样
im_1 = myAverage(im);
im_2 = myAverage(im_1);
im_3 = myAverage(im_2);
% 也可以使用频域的低通滤波,但是还原程度不如空域的操作
% im_1 = Guss(im,200);
% im_2 = Guss(im_1,200);
% im_3 = Guss(im_2,200);
%% 得到预测残差金字塔 使用双线性内插
im_e1 = im - uint8(255*mat2gray(myBilinear(im_1,2,2)));
im_e2 = im_1 - uint8(255*mat2gray(myBilinear(im_2,2,2)));
im_e3 = im_2 - uint8(255*mat2gray(myBilinear(im_3,2,2)));
%% 将结果保存到当前目录下的result文件夹下
imwrite(im_1, sprintf('result/_%s.jpg', 'rank_8'));
imwrite(im_2, sprintf('result/_%s.jpg','rank_7'));
imwrite(im_3, sprintf('result/_%s.jpg','rank_6'));
imwrite(im_e1, sprintf('result/_%s.jpg','left_9'));
imwrite(im_e2, sprintf('result/_%s.jpg', 'left_8'));
imwrite(im_e3, sprintf('result/_%s.jpg', 'left_7'));
%% 显示结果
figure(1);
subplot(241); imshow(im); title('原图(9级)'); axis on
subplot(242); imshow(im_1); title('一次(8级)'); axis on
subplot(243); imshow(im_2); title('两次(7级)'); axis on
subplot(244); imshow(im_3); title('三次(6级)'); axis on
subplot(245); imshow(im_e1); title('残差(9级)'); axis on
subplot(246); imshow(im_e2); title('残差(8级)'); axis on
subplot(247); imshow(im_e3); title('残差(7级)'); axis on
subplot(248); imshow(im_3); title('三次(6级)'); axis on
功能函数:
function [img_2] = myAverage(img_1)
size_1 = size(img_1);
h = size_1(1);
w = size_1(2);
img_2 = zeros(h, w);
%%边缘延拓两行两列
a = img_1(1,:);
b = img_1(h,:);
img_1 = [a;img_1;b];
c = img_1(:,1);
d = img_1(:,w);
img_1 = double([c,img_1,d]);
%3X3均值模板
L = 1/16*[1 2 1;2 4 2;1 2 1];
for i= 1:h
for j = 1:w
im = [img_1(i,j) img_1(i,j+1) img_1(i,j+2);...
img_1(i+1,j) img_1(i+1,j+1) img_1(i+1,j+2);...
img_1(i+2,j) img_1(i+2,j+1) img_1(i+2,j+2)];
img_2(i,j) = round(sum(sum(L.*im)));
end
end
%图像下采样
M = floor(h/2);
N = floor(w/2);
im_p = zeros(M,N);
for x = 0:1:M-1
for y = 0:1:N-1
im_p(x+1,y+1) = img_2(2*x+1,2*y+1);
end
end
img_2 = uint8(im_p);
end
function im_p = Guss(im,D0)
[M,N] = size(im);
%图像进行二位傅里叶变换,之后移动到中心点
im_double = mat2gray(im,[0 255]);
im_F = fftshift(fft2(im_double)); % 空域 > 频域
%图像进行高斯低通滤波
H = zeros(M,N);
for u = -M/2:1:M/2-1
for v = -N/2:1:N/2-1
D = (u)^2+(v)^2;
if (D == 0)
H(u + M/2 + 1,v + N/2 + 1) = 1;
else
H(u + M/2 + 1,v + N/2 + 1) = exp(-D/(2*D0^2));
end
end
end
im_G = H .* im_F;
%图像反变换
im_g_double = real(ifft2(ifftshift(im_G)));
im_p = im2uint8(mat2gray(im_g_double));
function [im_b] = myBilinear(im, Rh,Rl)
%双线性内插算法
[line,row] = size(im);
%图像补零
im = [im;im(line,:)];
im = [im,im(:,row)];
im = double(im);
%新的行数和列数,预分配内存
line_n = round(Rh * line);
row_n = round(Rl * row);
%向量化循环,防止溢出
x_n = 1 : line_n;
y_n = 1 : row_n;
%投影回去的位置
x = x_n * (line - 1) / (line_n - 1) + (line_n - line) / (line_n - 1);
y = y_n * (row - 1) / (row_n - 1) + (row_n - row) / (row_n - 1);
%对原坐标取整
i_x = floor(x);
i_y = floor(y);
%周围点的距离
u_x = x - i_x;
u_y = y - i_y;
w_x = 1 - u_x;
w_y = 1 - u_y;
%根据距离确定权重,得到插值后的图像
im_b(x_n,y_n) = w_x' * w_y .* im(i_x,i_y) + w_x' * u_y .* im(i_x,i_y + 1)...
+ u_x' * w_y .* im(i_x + 1,i_y) + u_x' * u_y .* im(i_x + 1,i_y + 1);
%im_b = uint8(im_b);
end
在本次实验中,首先对原图求出来四阶图像金字塔,之后利用插值进一步得到残差金字塔。实验结果如下:
图一:空域滤波的图像金字塔
图二:空域滤波的残差金字塔
如上图所示,通过空域的高斯低通滤波得到图像金字塔,之后与原图像求差值,可以得到残差金字塔。之后还使用了频域的高斯滤波尝试得到图像金字塔和残差金字塔,得到的结果如图所示。
图三:频域滤波的图像金字塔
图四:频域滤波的残差金字塔
可以看出使用空域的模板时不会直接消除高频的噪声,但是在使用频域的高斯低通滤波器时,可以在第一次时,消除大部分高频噪声,之后的残差图像变得更加稀疏,有利于存储
从上述实验结果可以看出,使用空域的高斯滤波器可以得到书中一致的图像金字塔和拉普拉斯金字塔,效果较好,但是压缩效率可能会略低于频域的高斯滤波器处理结果。频域的处理的计算时间和计算量也要大于空域的处理。