Advertisement

Computer Vision(C. Rasche)计算机视觉 论文解读(3 Image Processing I: Scale Space, Pyramid and Gradient Image)

阅读量:

目录

3 Image Processing I: Scale Space, Pyramid and Gradient Image

3.1 Scale Space

3.2 Pyramid

3.3 Gradient Image

3.4 Exercises


3 Image Processing I: Scale Space, Pyramid and Gradient Image

对于许多计算机视觉任务来说,在分类处理不同类型的模糊图像是一种有效的方法。 该方法已在前面的部分中阐述了基本概念;在此处我们增加了这种类型的模糊,并达到了所谓的比例空间(如图4所示)。这一比例空间将在后续章节中详细讨论(第3.1节)。 接下来我们将介绍图像金字塔,在第3.2节中简要说明——通过缩小尺度空间来实现这一目标。

图4:图像的缩放空间。 从底部到顶部观察增加的模糊。

**Original: 未经过滤的图像

Io

。**

**Scale 1: 使用高斯滤波器sigma等于1,

igma = 1

来平滑

Io

。**

**Scale 2: 使用高斯滤波器

igma = 2

来平滑

Io

。**

**Scale 3: 使用高斯滤波器

igma = 3

来平滑

Io

。**

它被称为空间,因为可以将其视为三维空间,第三维对应于具有变量**

igma

的细到粗轴。
在较粗的尺度(较大的

igma

在**值较低的情况下相对容易地找到整体的轮廓和区域。然而,在实际应用中,这种结构有时会受到其他不同类型的结构的影响。为了提高计算效率并减少数据量,在分析时通常会对较粗糙的尺度图像进行降采样处理,并最终构建金字塔状的空间表示形式。参见图5.附录I.2中的代码

在这种情况下,在各个颜色通道上依次应用滤波器,并单独应用于红、绿、蓝图像

对于许多计算来说,在每个像素处了解强度景观的定向方向也是有用信息。 具体而言,在小像素邻域内我们希望了解每个图像像素所对应的表面斜率的变化情况。 这种变化情况将通过梯度图像来表示,并将在3.3节中进行详细说明。

3.1 Scale Space

利用图像与其邻域内取均值的二维滤波器进行卷积操作以达到模糊效果。 在上一节中介绍的例子仅涉及求和操作,在实际应用中通常采用高斯滤波器来完成图像模糊处理过程(第2.2节)。 在这里作为二维函数应用的情况下,

\text{GaussianFilter}(x, y) = \frac{1}{\sigma^2\sqrt{2\pi}} e^{-\frac{x^2 + y^2}{2\sigma^2}}

其中σ为标准差参数。

geft

,其中x和y是图像轴,其中**

igma

也被视为一种调节模糊量的标准差- 同时也称为平滑参数,在信号处理领域中被表示为一种卷积操作。

*

表示。有人说,图像

I_{o}eft

由滤波器

geft

进行卷积

arge I_{c}eft  = I_{o}eft  * geft

(2)

导致更粗糙的图像

arge I_{c}

。如果您不熟悉2D卷积过程,请立即阅读附录B.2以熟悉它。

如果反复应用这种模糊化过程,则图像质量逐渐降低,并且相应的强度分布趋于光滑(如图4所示)。值得注意的是, 不同的方法均可构建尺度空间. 最直接的方法是通过不断增大尺寸并应用二维高斯函数进行低通滤波器处理原始图像, 首先应用于该过程

arge igma = 1

,然后使用

igma = 2

等。然而,这种方法有点慢并且存在快速实现,为此我们参考附录B.2。

得到的图像堆栈,

eft  I_{0}, I_{1}, I_{2}, dots ight

:称为尺度空间。
在典型的尺度空间示意图中,
底部图像对应原始图像;
随后的较高层次图像对应较为粗略的版本。
换句话说,
这些图像按照从下至上的排列,
构成了一个由细至粗度组成的轴线,
此轴线现已被标注

igma

。 然后将得到的空间表示为

Seft

(3)

igma

可以理解为平滑变量:等于零的

igma

值对应于原始图像,即,没有平滑;

igma

值等于1对应于第一粗略图像等。在应用中,sigma值通常在1到5之间,

igma = 1, 2, ..., 5

Application 尺度空间特别用于以下特征检测过程:

  1. 区域识别:通过相互比较或调整各个区域间的尺度差异来确定其亮度与暗淡程度的变化是我们将在4.1节中介绍的技术。
  2. 跨越尺度(轴)结构检验:例如,在不同层次或程度上识别特定标志将帮助我们排除偶然现象的可能性。这种方法通常用于特征检测工作(第6节)。
  3. 探索更多的‘连贯性’:例如,在较低分辨率层次下观察图像边缘更容易发现整体的一致性与规律性。

通过Matlab软件,我们可以通过调用函数fspecial来生成高斯滤波器,并结合conv2函数进行图像的卷积处理。

复制代码
 Fsc1 = fspecial(’gaussian’, [3 3], 1); % 2D gaussian with sigma=1

    
 Fsc2 = fspecial(’gaussian’, [5 5], 2); % 2D gaussian with sigma=2
    
 Isc1 = conv2(Io, Fsc1, ’same’);        % filtering at scale=1

图像处理工具箱还包含像imgaussfilt和imfilter这样的命令用于生成模糊图像,并且可能被视为优先选项。这些命令由于经过了针对速度的优化设计而备受青睐。

在Python环境中,Python子库scipy中的ndimage模块提供了实现图像模糊效果的高斯滤波器函数。

复制代码
    scipy.ndimage.gaussian_filter(I, sigma=1.0)

该层次空间带来的额外信息有助于改进我们的特征提取过程。然而这种增益是以内存使用量增加为代价的因为当前处理的是多个图像。此外在搜索特征时计算量也会随之上升。不过我们可以采用一种方法即对粗层次进行压缩从而降低整个层次空间而不至于造成太大的信息损失这将使我们在下一节中更有效地处理金字塔结构

图5展示了图像的空间多尺度金字塔结构。在尺度空间(如图4所示)中每隔一个像素进行一次下采样操作:即在从细致到粗放的方向上每级缩放一半的空间分辨率。

**Original:

P_{0} =

原始

I_{o}

**

**Level 1:

P_{1} = I_{c1}eft  ight

的子采样**

**Level 2:

P_{2} = I_{c2}eft  ight

的子采样**

**Level 3:

P_{3} = I_{c3}eft  ight

的子采样**

它被称为金字塔形结构;由于人们能够对齐图像以达到金字塔的效果;为了简化起见,在正面展示图像。

3.2 Pyramid

采用整个尺度空间S的操作从计算资源的角度来看成本较高

I_{c}

,仅沿着水平轴并且沿着垂直轴每秒拍摄一个像素。 我们如此到达

P_{0}

P_{3}

Level (octave) pyramids, see Figure 5. In a higher-level language, we can achieve downsampling by selecting every other row and column—this approach is referred to as manual downsampling. As shown in the following section, this method is employed to downsample the sampled rows.

复制代码
    Idwn = Isc1(1:2:end,:); % sub-sampling rows

接下来是子采样列:

复制代码
    Idwn = Idwn(:,1:2:end); % sub-sampling columns

在MATLAB中也提供了downsample函数这一工具,在这种情况下仅当输入为矩阵时才具备适用性;为了实现沿列方向的下采样操作则需先对原始矩阵进行翻转处理。此外,在MATLAB中还有一个函数称为impyramid(或其他类似名称),该函数既能执行高斯滤波器处理也能实现下采样功能;不过我们也可以考虑对其他维度进行操作并结合上采样技术以达到更好的效果

复制代码
 I1  = impyramid(I0,’reduce’);  % filter and downsampling every 2nd

    
 I0  = impyramid(I1,’expand’);  % upsampling every 2nd

若希望进行除了缩小至原来的一半大小或放大一倍以外的上下采样操作,则函数imresize将是一个更为便捷的选择。

Python

skimage.transform.pyramid reduce 和 .pyramid expand

Application 在多种匹配任务中,在完成初步潜在特征检测后,
模式从金字塔顶端开始逐步细化,
最终达到底层的整体效果最为显著;
这一策略也被称为由粗到精(或自底向上)搜索策略;
进一步说明:仅在以粗略水平进行潜在检测之后,
随后转向更高细节级别的验证过程,
并且由于更高层次的空间分辨率带来的计算复杂度增加导致整个过程所需的时间更为漫长。

3.3 Gradient Image

梯度图像记录了强度景观中各点处的陡峭程度,在GIS(地理信息系统)中常被用来分析地形特征。 梯度图像是通过对地形表面进行二维空间分析得到的结果,在这种分析过程中会生成两个关键参数:一个是方向——即梯度方向;另一个是大小——即陡坡的程度。 在这种情况下,梯度图像是一个由方向和大小组成的二维空间映射关系图

如图6所示:梯度图像。箭头所指的方向表示该区域内的局部斜率变化趋势;箭头长度则反映该区域内的梯度强度。其指向方向对应于该区域的最大灰度值;其中白色代表最大值(255),黑色代表最小值(0)。

(图片描绘的是什么?提示:眯起眼睛产生粗糙的比例。)

为了计算梯度,在图像处理中通常会求出在两个方向上的导数值。具体数值则为沿x轴和y轴的差分结果。

rac{artial I }{artial x}

rac{artial I }{artial y}

。 此操作通常使用nabla符号

igtriangledown

表示,求梯度运算:

igtriangledown I = eft ^{T}

(4)

由此,梯度信息表示为矢量。 我们举例说明:平面上的一个点没有倾斜,因此没有大小和无关的方向 - 梯度为零; 斜率中的点具有特定方向 - 超出eft 范围的角度值 - 以及表示陡峭度的特定斜率。 使用两个参数(atan2)使用反正切函数计算方向,在大多数软件实现中返回值n eft 。 使用毕达哥拉斯公式计算斜率

eft  igtriangledown I ight

直接在原始图像中计算梯度场往往难以得到理想的结果

igma =1

Matlab中的常规函数为imgradient ,该函数直接输出梯度幅值及其方向(Image Processing Toolbox);如果后续代码仍需计算梯度,则可调用imgradientxy函数获取相应的两个梯度矩阵。当MathWorks工具包缺失时 ,此时可采用以下方法实现:其中函数gradient将返回两个矩阵 —— 与输入图像具有相同尺寸 —— 分别表示其沿二维方向的变化率

复制代码
 Fg         = fspecial(’gaussian’,[3 3],1); % 2D gaussian of size 3x3 with sigma=1

    
 Isc1       = conv2(I, Fg, ’same’);
    
 [Dx Dy]    = gradient(single(Isc1));       % gradient along both dimensions
    
 Dir        = atan2(-Dy, Dx) + pi;          % [-pi,pi]
    
 bk0        = Dir<0;                        % negative values
    
 Dir(bk0)   = Dir(bk0)+2*pi;                % [0,2*pi]
    
 Mag        = sqrt(Dx.^2+Dy.^2);            % gradient magnitude

在示例代码中,角度值被移动到正范围eft 。 可以使用函数quiver绘制梯度场:

复制代码
 % --- Plotting:

    
 X = 1:ISize(2);  Y = 1:ISize(1);
    
 figure(1); clf; colormap(gray);
    
 imagesc(I, [0 255]); hold on;
    
 quiver(X, Y, Dx, Dy);

Python 中,我们可以用numpy模块中的gradient函数:

复制代码
    Dx, Dy = numpy.gradient(I)

Applicaiton

3.4 Exercises

为了实现多个功能模块,在编写一些基础功能时并非立即将其封装成独立的功能模块文件(即单独的功能块),而是先在测试脚标中开发代码至t_NameOfScript(其中't'代表'test'),因为调试在测试阶段比在一个独立的功能块内调试更为便捷明了。当我们在测试阶段充分完成了代码开发后,并将这些指令复制到名为f_NameOfFunction的功能块中(即功能$f)。请勿删除用于后续验证的基础功能模块文件!最后,在执行基础功能模块完成后调用该功能块以验证输出结果。通过比较基础阶段输出与该基础功能运行后的结果差异来判断其工作效果如何。

  1. 编写脚本t_Pyramid,为图像生成金字塔(例如,参见附录I.2)。 将级别存储在cell或struct中。 用subplot显示金字塔。
    1. 首先了解滤波器:绘制它们并在中心观察它们的最大值。 使用colorbar绘制每个的尺度。 应用命令imagesc,限制为[0 0.15]。
    2. 仔细观察滤波后的图像。 不同级别的(强度)范围是多少? 再次使用colorbar来说明。 值为0是什么颜色? 什么是最大值?
    3. 仔细观察图像边界。 在边界处,不能正确应用滤波器:改为做什么? 有什么选择?
    4. 最后,将代码放入函数f_Pyramid中。
  2. 编写一个生成梯度图像的脚本t_GradImg,有关提示,请参见第3.3节。
    1. 在单独的图像(imagesc)中显示方向和斜率的地图。 使用colorbar验证范围。 斜率值在哪里最大?
    2. 现在用命令quiver(箭头)显示梯度 - 方向和斜率 - 并将输出放在图像的顶部(不要忘记hold on)。 对于大图像,可能需要很长时间 - 几秒钟 - 才能显示所有箭头。 放大结果以验证输出。 箭头朝哪个方向指向? 在强度图像中向上,向下? 什么测量对应箭头的长度?
    3. 最后,编写函数f_GradImg,它将图像I作为输入并返回两张地图,一个具有方向值,另一个具有斜率。 返回结构中的地图GM:GM.Dir = Dir,GM.Mag = Mag,以后使用更方便。 现在使用任何(GM.Dir(:) - Dir(:))验证测试脚本末尾的函数:如果为0则可以,如果没有,那么我们可能会出错 - 尽管可能存在四舍五入的差异; 用any(sum(abs(GM.Dir(:) - Dir(:)))> 0.1)验证。

希望本文能帮助你在计算机视觉领域走得更远,学习得更加深入!

全部评论 (0)

还没有任何评论哟~