数字图像金字塔
1、什么叫数字图像金字塔
图像金字塔简单来说就是,每次隔一行取点,直到取到的行数为1,最后就每次取到的图像看起来就像一个金字塔。图像金字塔的应用非常广泛,例如,用图片查看器看图片的时候,会发现看图片的时候总是从模糊看到清晰的。这是因为,图片查看器先将金字塔顶端的图片显示出来,再慢慢显示完整的图片的。这样可以让用户忽略等待过程中的黑屏过程,让漫长的等待加载时间变得和谐起来。
2、实现原理
在这次实验中,我采用的方法是,按相隔距离以2的幂为差值递减采点,也就是一开始采第一行,接着采第一行和第 n/2 行 ,接着采第一行和第 n/4 、 n/2 、 n*3/4 行,以此类推直到将图片显示出来。需要注意的是在隔行采点之前,需要对图片做剪切,使得长宽均为2的幂,以方便处理,代码中的 cutImg 函数在这里 http://blog.youkuaiyun.com/yangyudong2014/article/details/40920617 。
还需要注意的是在隔行采点之前要对图片进行加权平均取值,因为如果在图像中有一条直线只有一个像素宽,那么在隔行取点的时候可能就会忽略这一行,导致影响比较大,如果进行加权平均的话,可以将这条直线的扩散到附近,以减小隔行取点的影响。
3、实现代码
%% 图像金字塔,包含演示过程
% 作者:杨宇东
% 日期:2014.11.6
% 参数:待处理的图片数组
% 输出:高斯模糊之后的图片
%%
function g = GaussianImagePyramid(img)
im = cutImg(img);
% 建立一个 3*3 的高斯滤波器
h = fspecial('gaussian', [3 3], 1);
% 卷积运算
g = imfilter(im, h, 'conv');
[nHeight, nWidth, nDim] = size(im);
NPlus = min(nHeight, nWidth);
N = fix(log2(NPlus));
for i = N : -1 : 0
s = im(1 : 2^i : NPlus, 1 : 2^i : NPlus, :);
figure;
imshow(s);
end
figure;
imshow(img);
figure;
for i = N : -1 : 0
s = im(1 : 2^i : NPlus, 1 : 2^i : NPlus, :);
subplot(1, N + 1, N - i + 1), imshow(s);
end