【CV】解析图像金字塔 Image Pyramid

图像金字塔 Image Pyramid

Img Pyramid

图像金字塔指的是对图像重复进行平滑和向下采样(repeated smoothing and subsampling), 每次得到的图像都是新的图像宽与高是原来图像的1 / 2. 这样不断重复,得到一组图像,组合在一起,看起来像金字塔形状,所以叫图像金字塔。得到图像金字塔后,后续可以进行图像 尺度空间分析 和 多分辨率分析( scale-space representation and multiresolution analysis)。

常用的图像金字塔,有 高斯金字塔和拉普拉斯金字塔。

其中,金字塔由底层向上生成, L0 -> L1 -> … Ln, 叫做图像的 reduce,而金字塔友顶向下生成,Ln -> Ln-1 -> … -> L0, 叫做图像的 expand。

高斯金字塔

高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,前者比较清晰,后者比较模糊,前者比较大,后者比较小,通过前者能看到图像的一些细节信息,通过后者能看到图像的一些轮廓的信息,这就是图像的尺度,图像的尺度是自然存在的,并不是人为创造的。好了,到这里我们明白了,其实以前对一幅图像的处理还是比较单调的,因为我们的关注点只落在二维空间,并没有考虑到“图像的纵深”这样一个概念,如果将这些内容考虑进去我们是不是会得到更多以前在二维空间中没有得到的信息呢?于是高斯金字塔横空出世了,它就是为了在二维图像的基础之上,榨取出图像中自然存在的另一个维度:尺度。因为高斯核是唯一的线性核,也就是说使用高斯核对图像模糊不会引入其他噪声,因此就选用了高斯核来构建图像的尺度。

下图两幅图像是典型的图像高斯金字塔,这就是模仿的图像离你远去时在你视网膜上的成像,图像分别以动态方式表示。

Gaussian Pyramid

具体来看,高斯金字塔的Reduce过程分为高斯模糊和偶数行采样两步。公式表示如下,

G ( n + 1 ) ( i , j ) = m = 2 2 n = 2 2 W ( m , n ) G n ( 2 i m , 2 j n )
. 其中 W ( m , n ) 5 × 5 的高斯卷积核。

高斯金字塔向下 Expand 的公式如下:

G n 1 ( i , j ) = 4 m = 2 2 n = 2 2 W ( m , n ) G n ( ( i m ) / 2 , ( j n ) / 2 )
.
在 Expand 情况下, ( i m ) / 2 ( j n ) / 2 必须为整除。这是编程时最重要的一个处理(???)。

MATLAB 代码

A = imread('lena512.bmp');
kernel=fspecial('gaussian',[5 5],1);

G_A0 = A;
G_A1 = conv2(G_A0,kernel,'same');
G_A1 = G_A1(2:2:size(G_A1,1),2:2:size(G_A1,2));
G_A2 = conv2(G_A1,kernel,'same');
G_A2 = G_A2(2:2:size(G_A2,1),2:2:size(G_A2,2));
G_A3 = conv2(G_A2,kernel,'same');
G_A3 = G_A3(2:2:size(G_A3,1),2:2:size(G_A3,2));
G_A4 = conv2(G_A3,kernel,'same');
G_A4 = G_A4(2:2:size(G_A4,1),2:2:size(G_A4,2));
G_A5 = conv2(G_A4,kernel,'same');
G_A5 = G_A5(2:2:size(G_A5,1),2:2:size(G_A5,2));

%get Laplacian Pyramid
L_A0 = double(G_A0)-imresize(G_A1,size(G_A0));
L_A1 = double(G_A1)-imresize(G_A2,size(G_A1));
L_A2 = double(G_A2)-imresize(G_A3,size(G_A2));
L_A3 = double(G_A3)-imresize(G_A4,size(G_A3));
L_A4 = double(G_A4)-imresize(G_A5,size(G_A4));
L_A5 = double(G_A5);

imwrite(uint8(G_A1),'G_A1.jpg');
imwrite(uint8(G_A2),'G_A2.jpg');
imwrite(uint8(G_A3),'G_A3.jpg');
imwrite(uint8(G_A4),'G_A4.jpg');
imwrite(uint8(G_A5),'G_A5.jpg');

imwrite(uint8(L_A1),'L_A1.jpg');
imwrite(uint8(L_A2),'L_A2.jpg');
imwrite(uint8(L_A3),'L_A3.jpg');
imwrite(uint8(L_A4),'L_A4.jpg');
imwrite(uint8(L_A5),'L_A5.jpg');

G_A5

G_A4

G_A3

G_A2

G_A1

拉普拉斯金字塔

拉普拉斯金字塔构建基于高斯金字塔,每一次使用的是高斯差分DoG(Difference of Gaussian),即用本层的高斯图,减去更高一层高斯图expand 下来的结果

L ( n ) = G ( n ) e x p a n d ( G ( n + 1 ) )
,注意

  • L 0 = G 0 e x p a n d ( G 1 )
  • L 1 = G 1 e x p a n d ( G 2 )
  • . . .
  • L n = G n , 注意在这最顶上最小的一层,是原汁原味的高斯图,不是DoG图,是用来恢复下面一层的。

L_A5

L_A4

L_A3

L_A2

L_A1

Ref

猜你喜欢

转载自blog.csdn.net/baishuo8/article/details/80939126