强度图像(Intensity Images)

强度图像是一个数据矩阵,其中的值表示一定范围内的强度。它用一个矩阵表示,矩阵中的每个元素对应一个图像像素。在MATLAB中,可以使用imagesc(image scale)函数显示强度图像。

例如,一个简单的强度图像可以表示为:

1
2
110
011

在这个二维矩阵中,每个数字表示一个像素的强度值,1表示亮度较高,0表示亮度较低。

索引图像(Indexed Images)

索引图像由一个数据矩阵X和一个颜色映射矩阵map组成。map是一个m×3的双精度浮点数数组,数值范围在[0,1]之间。map矩阵的每一行表示一个颜色,包含红、绿、蓝三个分量。

例如,一个简单的索引图像可以表示为:

数据矩阵 X:

1
2
1 2
3 4

颜色映射矩阵 map:

1
2
3
4
0.0 0.0 0.0 
1.0 0.0 0.0 
0.0 1.0 0.0
0.0 0.0 1.0 

在这个例子中,数据矩阵X的元素表示索引值,对应于颜色映射矩阵map中的颜色。例如,X中的元素1表示map中的第1行颜色,即黑色;X中的元素2表示map中的第2行颜色,即红色,以此类推。

强度梯度(Intensity gradients)

强度梯度(Intensity gradients)是用来描述图像中亮度变化的一个重要概念。梯度描述了图像中强度变化的速度以及变化的方向。在图像处理中,强度梯度通常用于检测边缘,因为边缘处的像素强度变化较大。

我们详细讨论一下梯度的计算:

假设我们有一个图像,它的像素强度由函数 f(x, y) 给出。f(x, y) 可以理解为一个离散函数,得到图像在 x 和 y 坐标上的强度。针对彩色图像,可能分别需要为RGB各定义一个强度函数。在这个函数中,x 和 y 分别表示图像的水平和垂直坐标。我们的目标是求解强度在 x 和 y 方向上的变化,分别表示为 Gx 和 Gy。为了实现这一目标,我们可以分别计算函数 f(x, y) 关于 x 和 y 的导数。

虽然这里的 f(x, y) 是一个离散函数,但在图像处理中,我们仍然可以使用一些连续函数的概念(如导数、梯度等)来分析和处理图像。为了实现这一目标,我们通常会采用差分等方法来近似连续函数中的导数。

例如,Gx 可以通过计算相邻像素在水平方向上的强度差来近似:

$$ G_x \approx f(x, y + 1) - f(x, y) $$

类似地,Gy 可以通过计算相邻像素在垂直方向上的强度差来近似:

$$ G_y \approx f(x, y) - f(x + 1, y) $$

梯度向量 G 可以表示为:

$$ \vec{G}[f(x, y)]=\left[\begin{array}{c} G_x \ G_y \end{array}\right] $$

接下来,我们可以计算梯度的大小(magnitude)和方向(direction)。大小表示强度变化的速度,方向表示强度变化的方向。它们可以通过以下公式计算:

$$ \begin{array}{ll} \text { magnitude } & M(\vec{G})=\sqrt{G_x^2+G_y^2} \end{array} \begin{array}{ll} \text { direction } & \alpha(x, y)=\tan ^{-1}\left(\frac{G_y}{G_x}\right) \end{array} $$

简单总结一下,强度梯度描述了图像中强度变化的速度和方向,可以通过计算关于 x 和 y 的导数(在离散图像中使用差分近似)来求解。强度梯度在计算机视觉中有很多应用,例如边缘检测。

近似梯度(Approximating the gradient)

近似梯度的基本思想是使用差分(difference)来估计导数,为了增强差分效果,这里,我们使用一个简单的1x2和2x1的掩模(mask)来计算图像在水平方向和垂直方向上的强度变化,这两个方向上的强度变化分别表示为Gx和Gy。

1
Gx: -1  1
1
2
Gy:  1
    -1

Gx掩模表示水平方向上的强度变化;Gy掩模表示垂直方向上的强度变化。我们通过将这些掩模应用到图像上的每个像素和其相邻像素,计算加权和,从而得到近似梯度。但通常来说,我们希望在同一个地方进行计算,所以一般2x2(也就是NxN)的掩模更为常用。

Roberts 和 Sobel

除了前面提到的简单梯度估计方法外,还有一些常用的边缘检测器,例如:

Roberts边缘检测器:

1
2
Gx:   1  0     Gy:   0 -1
     0  -1          1  0

Sobel边缘检测器:

1
2
3
Gx:  -1  0  1     Gy:   1  2  1
     -2  0  2          0  0  0
     -1  0  1         -1 -2 -1

这些边缘检测器通过使用不同的梯度估计掩模(mask),来提取图像中的边缘信息。

Pros and Cons

Roberts边缘检测器

Pros:

  • 计算简单,速度快:Roberts边缘检测器使用的掩模(mask)是2x2的,相较于更大的掩模,计算较简单,消耗较少的计算资源。
  • 对于对角线边缘有较好的响应:Roberts检测器的掩模是对角线方向的差分,这使得它在检测对角线边缘时表现较好。同时边缘较细。

Cons:

  • 对噪声敏感:由于Roberts边缘检测器使用的掩模较小,它对噪声的平滑能力有限,因此容易受到噪声的影响。
  • 边缘定位精度较低:由于Roberts边缘检测器只计算了对角线方向的差分,而未考虑水平和垂直方向的差分,因此边缘定位的精度较低。

Sobel边缘检测器

Pros:

  • 对噪声的抗干扰能力较强:Sobel边缘检测器使用的是3x3的掩模,可以在计算梯度时对图像进行一定程度的平滑,从而降低噪声对边缘检测的影响。
  • 边缘定位精度较高:Sobel检测器在水平和垂直方向上都进行了差分计算,因此可以更准确地定位边缘。

Cons:

  • 计算量相对较大,速度较慢:Sobel边缘检测器使用的是3x3的掩模,相较于较小的掩模,计算量更大,速度较慢。
  • 可能导致边缘宽度较宽:由于Sobel检测器在水平和垂直方向上都进行了差分计算,其对边缘的响应可能导致边缘宽度较宽。

卷积(Convolution)

卷积是计算图像像素的加权和的过程。对于图像中的每个像素[i, j],我们计算一个值h[i, j],通过将掩模(mask)平移到像素[i, j],并取邻域像素的加权和。

例如,假设我们有一个简单的图像矩阵A和一个掩模矩阵M:

1
2
3
A:  1 2 3    M:  -1 1
    4 5 6         1 1
    7 8 9

卷积过程如下:

  1. 将掩模矩阵M平移到A的左上角(1,1),将M中的每个元素与对应的A中的元素相乘,然后求和: (-1 * 1) + (1 * 2) + (1 * 4) + (1 * 5) = 10
  2. 将结果10放入新矩阵A_out的相应位置[1,1]:
1
2
A_out: 10 ? 
         ? ? 
  1. 按照类似的步骤,将掩模平移到其他像素位置,并计算加权和。最后得到卷积后的矩阵A_out:
1
2
3
4
5
6
A:  1 2 3    M:  -1 1
    4 5 6         1 1
    7 8 9

A_out: 10  4
        8  2

请注意,卷积过程会导致输出矩阵A_out的尺寸与输入矩阵A略有不同。为了解决边界问题,我们可以对输入矩阵进行填充(padding)操作,使得输出矩阵的尺寸与输入矩阵相同。

卷积过程导致输出矩阵A_out的尺寸与输入矩阵A略有不同,是因为我们在计算卷积时,需要将掩模矩阵M与输入矩阵A的每个像素的邻域相乘。当我们处理输入矩阵A的边缘像素时,掩模矩阵M可能会超出A的范围。为了避免这种情况,我们通常会忽略输入矩阵A的边缘像素,这导致输出矩阵A_out的尺寸比输入矩阵A小。

具体规则是:假设输入矩阵A的尺寸为a×b(行×列),掩模矩阵M的尺寸为m×n(行×列)。那么输出矩阵A_out的尺寸为(a-m+1)×(b-n+1)(行×列)。

例如,我们之前的例子中:

1
2
3
4
5
6
A:  1 2 3
    4 5 6
    7 8 9

M:  -1 1
     1 1

输入矩阵A尺寸为3×3,掩模矩阵M尺寸为2×2。根据规则,输出矩阵A_out的尺寸为(3-2+1)×(3-2+1)= 2×2。

为了解决边界问题,可以对输入矩阵进行填充(padding)操作。填充是在输入矩阵的边缘添加额外的像素,通常填充像素值为0。这样,当计算卷积时,边缘像素也可以被处理,输出矩阵的尺寸保持与输入矩阵相同。

在卷积过程中,输入矩阵A中的像素被掩模矩阵M覆盖到的次数可能不同。在我们的例子中,中心像素5被卷积两次,而其他像素值(例如1、3、7和9)只被卷积一次。这是因为我们在计算卷积时,需要沿着水平和垂直方向移动掩模矩阵M,从而遍历输入矩阵A中的所有有效邻域。

对于输入矩阵A中靠近中心的像素,它们会被掩模矩阵M覆盖到更多次,从而在输出矩阵A_out中对应的位置上,这些像素会对结果产生更大的贡献。而位于边缘的像素在卷积过程中被覆盖到的次数较少,对结果的贡献相对较小。

在实际应用中,这种现象可以帮助我们关注图像中更重要的区域(通常是靠近中心的像素),同时减小边缘像素对结果的影响。但是,在某些情况下,我们可能希望边缘像素和其他像素具有相同的贡献。在这种情况下,可以对输入矩阵进行填充(padding),从而使所有像素在卷积过程中被覆盖到的次数相同。

过滤器(Filters)

我们可以通过计算图像的强度变化(梯度)来检测边缘。我们可以使用过滤器(filters)的概念来实现这一点。

一个过滤器可以看作是一个掩模(mask),用于对输入图像进行卷积操作。例如,我们可以使用Sobel过滤器来检测边缘:

1
2
3
Gx:  -1 0 1    Gy:  1  2  1
     -2 0 2         0  0  0
     -1 0 1        -1 -2 -1

应用过滤器的步骤如下:

  1. 选择一个过滤器,例如Sobel过滤器。
  2. 将过滤器与图像进行卷积,计算每个方向(水平和垂直)的梯度值Gx和Gy。
  3. 根据梯度值计算边缘强度(magnitude)和方向(direction)。

线性过滤算法(Linear filtering algorithm)

线性过滤算法是对图像进行卷积操作的过程。给定一个输入图像矩阵A_in和一个掩模矩阵M,我们可以使用以下算法进行线性过滤:

1
2
3
4
5
for i=2:image_height-1
  for j=2:image_width-1
    A_out(i, j) = sum(sum(A_in(i-1:i+1, j-1:j+1) .* M))
  end
end

在这个算法中,我们遍历输入图像中的每个像素[i, j],使用掩模矩阵M计算加权和,然后将结果存储在输出图像矩阵A_out的相应位置。

例如,假设我们有一个输入图像A_in和一个Sobel过滤器Gx:

1
2
3
4
5
6
A_in:   0 1 1 3 4 5
        0 0 2 3 3 4
        0 0 4 6 3 5
Gx:    -1 0 1
       -2 0 2
       -1 0 1

应用线性过滤算法后,我们可以得到卷积后的输出图像A_out。

噪声(Noise)

在处理图像时,我们通常需要面对图像中的噪声。噪声是由各种因素引起的图像质量下降,比如光照、摄像头传感器或数据传输时的误差等。为了改善图像质量,我们需要采用一些方法来消除或减小噪声。

有许多种噪声过滤器,我们可以使用卷积的概念来实现这些过滤器。例如,平均值滤波器(Mean filter)是一种简单的线性滤波器,可以用于降低噪声。

噪声过滤(Noise filtering)

我们可以使用卷积对图像进行噪声过滤。例如,通过应用平均值滤波器,我们可以降低图像中的噪声:

平均值滤波器的例子:

1
2
3
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9

这是一个线性滤波器。然而,在实际应用中,最常用的噪声过滤器是高斯滤波器(Gaussian filtering)。高斯滤波器的例子:

1
2
3
4
5
 0.003   0.0133  0.0219  0.0133  0.003
 0.0133  0.0596  0.0983  0.0596  0.0133
 0.0219  0.0983  0.1621  0.0983  0.0219
 0.0133  0.0596  0.0983  0.0596  0.0133
 0.003   0.0133  0.0219  0.0133  0.003

高斯滤波器可以更好地保留图像的边缘信息,同时消除噪声。

高斯滤波器之所以能更好地保留图像的边缘信息,原因在于它的平滑效果与像素距离的关系。高斯滤波器是一个加权平均滤波器,权重是根据高斯函数分布来确定的。在高斯滤波器中,中心像素的权重最大,离中心像素越远,权重越小。

高斯函数具有以下特点:

  1. 中心对称(bell-shaped):权重沿着中心对称分布,这意味着在边缘附近的区域,相邻像素的权重比远离中心的像素大,这有助于保留边缘信息。

  2. 平滑性:高斯函数是一个连续且平滑的函数,这意味着在边缘附近的像素变化不会导致突然的权重变化,从而保留边缘的连续性。

  3. 可调参数(尺度因子,scale factor,或σ):高斯函数的σ参数可以调整滤波器的平滑程度。较大的σ值会使滤波器更平滑,保留更多的低频信息(如边缘),而较小的σ值会使滤波器更敏感,更容易捕捉到高频信息(如噪声)。

因此,高斯滤波器可以在消除噪声的同时,更好地保留图像的边缘信息。当你理解高斯滤波器能保留边缘信息的原因后,请告诉我,然后我们将继续学习下一个知识点。

平均值滤波器的效果(Effect of mean filtering)

平均值滤波器是一种简单的线性滤波器,通过对邻域像素进行平均来降低图像中的噪声。然而,平均值滤波器不能很好地保留图像的边缘信息。这是因为平均值滤波器对所有邻域像素使用相同的权重,而不考虑像素之间的距离。因此,在边缘区域,平均值滤波器可能会使边缘变得模糊。

你可以通过观察原始图像和应用不同大小的平均值滤波器后的图像来感受平均值滤波器的效果。例如,你可以尝试使用3x3和5x5的平均值滤波器,看看它们如何影响图像的边缘信息。

高斯滤波器的效果(Effect of Gaussian filtering)

高斯滤波器是一种非线性滤波器,它使用高斯函数对图像进行平滑处理。与平均值滤波器不同,高斯滤波器对邻域像素的权重是根据它们距离中心像素的距离分配的。这意味着,距离中心像素较近的像素会有更大的权重,而距离较远的像素会有较小的权重。

高斯滤波器可以更好地保留图像的边缘信息,同时消除噪声。你可以通过观察原始图像和应用高斯滤波器后的图像来感受高斯滤波器的效果。例如,你可以尝试使用5x5的高斯滤波器,并观察它如何改善图像的边缘信息和噪声。

顺序滤波器(Sequenced filters)

在某些情况下,我们可以使用一系列的滤波器来替换一个复杂的滤波器。例如,我们可以用两个一维(1D)高斯滤波器顺序地替换一个二维(2D)高斯滤波器。这可以减少计算量,提高处理速度。

考虑一个二维高斯滤波器:

1
2
3
4
5
 0.003   0.0133  0.0219  0.0133  0.003
 0.0133  0.0596  0.0983  0.0596  0.0133
 0.0219  0.0983  0.1621  0.0983  0.0219
 0.0133  0.0596  0.0983  0.0596  0.0133
 0.003   0.0133  0.0219  0.0133  0.003

我们可以将其替换为两个一维高斯滤波器:

1
0.0545  0.2442  0.4026  0.2442  0.0545   (水平方向)

1
2
3
4
5
0.0545
0.2442
0.4026
0.2442
0.0545   (垂直方向)

首先,我们对输入图像应用水平方向的高斯滤波器,然后再应用垂直方向的高斯滤波器。顺序滤波器的结果与直接使用二维高斯滤波器相同,但计算量更小。

拉普拉斯算子(Laplacian Operator)

  1. 推导:

拉普拉斯算子是一个基于图像二阶导数的边缘检测算子。它的二维形式为:

$$ \nabla^2 f(x, y) = \frac{\partial^2 f(x,y)}{\partial x^2} + \frac{\partial^2 f(x,y)}{\partial y^2} $$

其中,f(x, y) 表示图像中的强度值。在离散图像中,我们可以使用以下差分表示来计算二阶导数:

$$ \frac{\partial^2 f(x,y)}{\partial x^2} \approx f(x-1, y) - 2f(x, y) + f(x+1, y) \\ \frac{\partial^2 f(x,y)}{\partial y^2} \approx f(x, y-1) - 2f(x, y) + f(x, y+1) $$

将这两个公式结合起来,我们可以得到拉普拉斯算子的一个离散表示:

1
2
3
 0   1   0
 1  -4   1
 0   1   0
  1. 应用:

拉普拉斯算子通常用于检测边缘、线条和角点等图像特征。在实际应用中,我们可以先对图像进行高斯滤波以消除噪声,然后再应用拉普拉斯算子。这样可以提高边缘检测的准确性,同时降低对噪声的敏感性。

  1. 例子:

假设我们有一个简单的图像矩阵A:

1
2
3
4
5
A:  0 0 0 0 0
    0 1 1 1 0
    0 1 1 1 0
    0 1 1 1 0
    0 0 0 0 0

我们可以将拉普拉斯算子与图像矩阵进行卷积,得到边缘强度矩阵B:

1
2
3
4
5
B:  0 0 0 0 0
    0 1 2 1 0
    0 2 -4 2 0
    0 1 2 1 0
    0 0 0 0 0
  1. 优势:

拉普拉斯算子可以检测到边缘、线条和角点等特征。同时,它具有旋转不变性,即在旋转图像时边缘检测的结果不会改变。

  1. 计算方式:

要使用拉普拉斯算子对图像进行边缘检测,我们需要执行以下步骤:

  • 首先,对图像进行高斯滤波或其他平滑操作,以降低噪声。
  • 然后,将拉普拉斯算子与平滑后的图像进行卷积。
  • 最后,可以通过设定一个阈值来确定边缘像素。

高度定向工作(Highly Directed Work)

还有一些高级的边缘检测方法,包括:

高斯(Canny)边缘检测

Canny边缘检测器是一种广泛使用的边缘检测方法,它首先使用高斯滤波器平滑图像以消除噪声,然后计算梯度的大小和方向。最后,Canny算法使用双阈值法检测和连接边缘。

二阶算子

二阶算子是一种基于图像的二阶导数(曲率)来检测边缘的方法。常用的二阶算子有Laplacian算子(拉普拉斯算子)和Laplacian of Gaussian(LoG,高斯-拉普拉斯算子)。它们可以检测到图像中的边缘和其他特征(如角点和线条)。

阈值处理(Thresholding)

阈值处理是一种简单的图像分割技术,通过设置一个阈值将图像分为两部分,即前景和背景。对于边缘检测,我们可以设置一个梯度强度阈值,将强度大于阈值的像素标记为边缘像素。

Exercise Sheet

The Laplacian Operator is the two-dimensional equivalent of the second derivative used for edge detection. The formula for the Laplacian of a function f(x,y) is $$ \nabla^2 f=\frac{\partial^2 f}{\partial x^2}+\frac{\partial^2 f}{\partial y^2} $$ which can be approximated by

1
2
3
 0  1  0
 1 -4  1
 0  1  0

(a) Given the 3x3 Intensity image below, apply the Laplacian Operator above to obtain a 3x3 output matrix

1
2
3
8 9 9
9 10 11
10 11 12

Intensity image with zero padding:

1
2
3
4
5
 0  0  0  0  0
 0  8  9  9  0
 0  9 10 11  0
 0 10 11 12  0
 0  0  0  0  0

Here, the output matrix will have the same size as the input matrix, 3x3. We compute the convolutions with the Laplacian kernel as follows:

Output ElementCalculation
(1,1)0*0 + 0*1 + 0*0 + 0*1 + 8*-4 + 9*1 + 0*0 + 9*1 + 10*0 = -24
(1,2)0*0 + 0*1 + 0*0 + 8*1 + 9*-4 + 9*1 + 9*0 + 10*1 + 11*0 = -20
(1,3)0*0 + 0*1 + 0*0 + 9*1 + 9*-4 + 9*1 + 10*0 + 11*1 + 12*0 = -18
(2,1)0*0 + 8*1 + 9*0 + 0*1 + 9*-4 + 10*1 + 0*0 + 10*1 + 11*0 = -26
(2,2)8*0 + 9*1 + 9*0 + 9*1 + 10*-4 + 11*1 + 10*0 + 11*1 + 12*0 = -22
(2,3)9*0 + 9*1 + 9*0 + 10*1 + 11*-4 + 11*1 + 11*0 + 12*1 + 12*0 = -20
(3,1)0*0 + 9*1 + 10*0 + 0*1 + 10*-4 + 11*1 + 0*0 + 11*1 + 12*0 = -28
(3,2)9*0 + 10*1 + 11*0 + 10*1 + 11*-4 + 12*1 + 11*0 + 12*1 + 12*0 = -24
(3,3)10*0 + 11*1 + 12*0 + 11*1 + 12*-4 + 12*1 + 12*0 + 12*1 + 12*0 = -22

The resulting 3x3 output matrix after applying the Laplacian Operator with zero padding is:

1
2
3
-24 -20 -18
-26 -22 -20
-28 -24 -22

(b) To determine edges, after applying the Laplacian Operator, we simply can not take the magnitude. What additional step is needed to find pixels that are edges?

(b) After applying the Laplacian Operator, we can’t directly take the magnitude to detect edges because the output may contain negative values. To find pixels that are edges, we first need to calculate the zero-crossings in the output matrix. Zero-crossings are points where the sign of the Laplacian output changes. So, we should look at the neighbors of each pixel and identify the points where a significant change in value (positive to negative or vice versa) occurs. These points are considered as edge pixels.

(c) Why are 2nd order edge detectors, such as the Laplacian Operator shown above, better at detecting sharper edges in Intensity Images, as compared to 1st order based operators? You should provide a direct comparison between 1st order and 2nd order derivatives for full marks.

(c) 2nd order edge detectors, such as the Laplacian Operator, are better at detecting sharper edges in intensity images compared to 1st order based operators because:

  1. 2nd order derivatives (Laplacian) are more sensitive to rapid changes in intensity, which are characteristics of sharp edges, while 1st order derivatives (e.g., the gradient) are better suited for detecting ramps or more gradual changes in intensity.

  2. The Laplacian Operator can detect edges by looking for zero-crossings, which provide a more precise localization of the edges compared to 1st order operators that rely on gradient magnitude thresholding.

In summary, 2nd order edge detectors, like the Laplacian Operator, are better at detecting and localizing sharp edges in intensity images because they are more sensitive to rapid intensity changes.