我知道编辑这个网站吗?

Labkit - 像素分类算法文档

像素分类算法

(建设中)

简介

基于随机森林的像素分类是一种既定的语义算法 图像分割。例如,它用于图像分析工具:ilastik, 可训练的 Weka 分割和 QuPath。 Labkit 的算法实现与那些工具非常相似,但需要 更加强调可扩展性。 本节介绍基于随机森林的像素分类算法的基本原理。

输入

  1. 要计算分割的图像。
  2. 该图像的标签,其中一些表示像素被标记为 某个类的例子。
  3. 用于特征提取的滤波器及其参数的选择。

输入注意事项: 输入图像的所有通道都将用于训练。对于单个通道的训练,单独加载它们。

显示示例:

输出

  1. 图像分割。
  2. 图像的概率图。
  3. 训练有素的随机森林分类器,可用于分割任意 图像数量。

显示示例:

算法

该算法分为三步:第一步计算特征 图像中每个像素的向量。第二步训练随机森林。 此步骤使用特征向量,但也需要一些用户输入。用户 需要标记图像中的一些像素,因为它们属于某个类别 - 例如 例如:前景/背景。算法的最后一步使用经过训练的 随机森林为整个图像生成分割。

首先我们构建一个功能堆栈。 特征堆栈是通过应用预定义的过滤器图像列表来构建的。 每个图像产生一个输出图像。 这些图像被堆叠起来构建一个多特征堆栈。 特征堆栈可以看作是输入图像的多通道版本。 对于每个像素,我们现在获得多个强度值 - 每个通道一个。这些 不同的强度值构建像素的特征向量。

算法的第二步是随机森林的训练。 此步骤还需要用户的额外输入。用户已标记 图像中的一些像素属于某个类别,例如前景 或背景。该信息与之前计算的特征一起 向量用于训练随机森林。 (引用论文)

随机森林最终应用于图像中的所有像素。由 查看像素的特征向量。随机森林预测 像素属于某个类别的概率。 概率要么被写入概率图中。或者类索引 被写入输出图像以构建分割。

用于特征提取的过滤器

像素分类算法使用一组滤波器来计算像素特征。 用户可以选择使用哪些滤波器以及如何参数化它们。 有两个设置会影响所有过滤器。 2d/3d 维度和 sigma 值列表。

输入

  • 输入图像\(I\)
  • 西格玛值列表 \(\sigma_1,...,\sigma_N\),其中 \(N\) 是西格玛值的数量
  • 输入图像是否应逐平面处理 (2d) 或作为体积图像 (3d) 的信息

符号

  • 令\(w_x\)和\(w_y\)表示\(x\)和\(y\)中像素的大小,通常我们使用\(w_x = w_y = 1\)。对于体积图像,\(w_x\)、\(w_y\)、\(w_z\) 表示体素的大小。对于各向异性 \(z\) 采样,使用 \(w_z \neq 1\)。
  • 列表中的每个 sigma 值都用于通过相应的高斯模糊滤波器模糊输入图像。这会产生输入图像的 \(N\) 不同模糊版本,我们将其表示为 \(G_i\):

    \[G_i := \mathrm{高斯}_{\sigma_i} I \qquad \mathrm{for} \quad i=1,...,N\]
  • 另外,我们定义 \(G_0 := I\) 为非模糊输入图像。
  • 我们通过 \(\partial_x G_i\) 和 \(\partial_y G_i\) 捐赠这些图像的一阶偏导数。 它们是通过图像与中心差异内核的卷积来计算的:

    \[\partial_x G_i = {1 \over w_x} [-0.5 \ 0 \ 0.5] \ast G_i\]

    我们还对体积图像使用 \(z\) 中的偏导数:\(\partial_z G_i\)

  • 类似地,我们用 \(\partial^2_x G_i\) 表示第二个阶部分 它们是通过将图像与内核 \([1 \ -2 \ 1]\) 进行卷积来计算的:

    \[\partial^2_x G_i = {1 \over w_x^2}[1 \ -2 \ 1] \ast G_i\]
  • 混合二阶导数表示为 \(\partial_x \partial_y G_i\),它们是通过输入图像的两个连续卷积计算的,内核为 \([-0.5 \ 0 \ 0.5]\)

    \[\partial_x \partial_y G_i := {1 \over w_y}[-0.5 \ 0 \ 0.5]_y \ast \left( {1 \over w_x}[-0.5 \ 0 \ 0.5]_x \ast G_i \right)\]

特征过滤器

原图

这个过滤器是其中最简单的,它的输出图像 \(F^\mathrm{ID}\) 是简单的输入图像:

\[F^\mathrm{ID} := I\]

高斯模糊

该过滤器输出 \(N\) 图像,它们是输入图像的高斯模糊版本: \(F^\mathrm{GAUSS}_i := G_i \qquad \mathrm{for} \quad i = 1,...,N\)

高斯的差异

该过滤器输出 \({1 \over 2}N(N+1)\) 图像,即输入图像的两个高斯模糊版本的像素减法。

\[F^\mathrm{DOG}_{i,j} := G_i - G_j \qquad \mathrm{对于} \quad i,j=1,...,N \quad \mathrm{与} \quad i<j\]

高斯梯度幅值

该过滤器产生 \(N+1\) 输出图像。每个 \(G_i\) 一个输出图像,\(i=0,...,N\)。通过计算每个像素中梯度向量的大小来生成输出图像:

\[F^\mathrm{GGM}_i := \sqrt{(\partial_x G_i)^2 + (\partial_y G_i)^2 + (\partial_z G_i)^2} \qquad \left(=|\ \mathrm{grad} \ G_i \ | \ \right)\]

(上面方程中的平方根、总和和平方是按像素计算的。)

高斯拉普拉斯算子

该过滤器产生 \(N+1\) 输出图像。每个 \(G_i\) 一个输出图像,\(i=0,...,N\)。 输出是二阶偏导数之和。

在二维中: \(F^\mathrm{LOG}_i := \partial^2_x G_i + \partial^2_y G_i\)

在 3d 中: \(F^\mathrm{LOG}_i := \partial^2_x G_i + \partial^2_y G_i + \partial^2_z G_i\)

Hessian 特征值

在二维中:

该过滤器产生 \(2(N+1)\) 输出图像。每个 \(G_i\) 有两个输出图像,\(i=0,...,N\)。 在接下来的几行中,我们将描述滤波器如何计算单个图像 \(G_i\) 的两个输出。我们省略下标 \(i\) 以保持方程的可读性。 滤波器首先计算二阶偏导数(对于二维图像):

\[H^{xx}:=\partial^2_x G \qquad H^{yy}:=\partial^2_x G \qquad H^{xy} := H^{yx} :=\partial _x \partial_y G\]

对于图像 G 中的每个像素 \(p\),这 4 个偏导数可以采样到 2x2 矩阵中。

\[H_p := \begin{bmatrix} H^{xx}(p) & H^{xy}(p) \\ H^{yx}(p) & H^{yy}(p) \end{bmatrix}\]

对于这个矩阵 \(H_p\),过滤器计算两个特征值 \(\lambda_{1,p} \leq\lambda_{2,p}\)。特征值被逐像素写入两个输出图像中:

\[F^\mathrm{HE}_1(p) := \lambda_{1,p} \\ F^\mathrm{HE}_2(p) := \lambda_{2,p}\]

在 3d 中:

过滤器产生 \(3(N+1)\) 输出图像。每个 \(G_i\) 三个图像。每个图像 \(G_i\) 有 9 个二阶偏导数。对于每个像素,它们被采样到对称的 3x3 矩阵中。该矩阵有 3 个特征值。按值排序,并写入三个输出图像。

结构张量特征值

在二维中:

该过滤器产生 \(4(N+1)\) 输出图像。每个 \(G_i\) 有四个图像,\(i=0,...,N\)。 让我们假设 \(i\) 现在是固定的。下面的文字将描述如何计算\(G_i\)的四张图像。这四个图像中的两个是使用参数 \(\gamma = 1\) 计算的,另外两个是使用 \(\gamma = 3\) 计算的。这个参数\(\gamma\)被称为积分比例,它的用途很快就会明白。 对于图像\(G\)(我们再次省略下标\(i\)),过滤器计算一阶导数的所有以下像素级乘积:

\[P^{XX} := \partial_x G \cdot \partial_x G \\ P^{XY} := \partial_x G \cdot \partial_y G \\ P^{YX} := \partial_y G \cdot \partial_x G \\ P^{YY} := \partial_y G \cdot \partial_y G\]

这些图像通过 \(\sigma=\gamma\) 的高斯模糊进行模糊处理:

\[Q^{XX}_\gamma := \mathrm{高斯}_\gamma \ P^{XX} \\ Q^{XY}_\gamma := \mathrm{高斯}_\gamma \ P^{XY} \\ ...\]

对于图像 \(G\) 中的每个像素 \(p\),可以将上面的四个模糊图像采样到对称的 2x2 矩阵中:

\[Q_p = \begin{bmatrix} Q^{XX}_\gamma(p) & Q^{XY}_\gamma(p) \\ Q^{YX}_\gamma(p) & Q^{YY}_\gamma(p) \end{b矩阵}\]

该矩阵有两个特征值 \(\lambda_{1,p} \leq\lambda_{2,p}\)。这两个特征值被逐像素写入两个输出图像中:

\[F^\mathrm{STEV}_1(p) := \lambda_{1,p} \\ F^\mathrm{STEV}_2(p) := \lambda_{2,p}\]

在 3d 中: 3d 中的过滤器产生 \(6(N+1)\) 输出图像。它的工作原理与 2d 版本类似。只需要一些自然的适应。 3D 图像具有三个一阶偏导数。这导致 \(9=3\cdot 3\) 像素级产品。这些产品再次被模糊化并组装成对称的 3x3 矩阵。该矩阵有 3 个特征值。特征值被排序并写入三个输出图像。

最小过滤器

该过滤器创建 N 个输出图像。它为 sigma 值列表中的每个 \(\sigma_i\) 生成一个输出图像。 对于输入图像 \(I\) 中的每个像素 \(p\),过滤器在方形邻域上迭代 找到这个邻域中的最小值。最小值被写入输出图像 \(F^\mathrm{MIN}\) 像素 \(p\) 的相应位置。正方形邻域的宽度和高度为 \(\lfloor 1 + 2\sigma_i \rfloor\) 像素。

在 3d 中,过滤器使用宽度、高度和深度均为 \(\lfloor 1 + 2\sigma_i \rfloor\) 像素的立方邻域。

最大滤波器/均值滤波器/方差滤波器

与最小过滤器相同,但计算平方/立方邻域的最大值/平均值/方差。