像素分类算法
(建设中)
简介
基于随机森林的像素分类是一种既定的语义算法 图像分割。例如,它用于图像分析工具:ilastik, 可训练的 Weka 分割和 QuPath。 Labkit 的算法实现与那些工具非常相似,但需要 更加强调可扩展性。 本节介绍基于随机森林的像素分类算法的基本原理。
输入
- 要计算分割的图像。
- 该图像的标签,其中一些表示像素被标记为 某个类的例子。
- 用于特征提取的滤波器及其参数的选择。
输入注意事项: 输入图像的所有通道都将用于训练。对于单个通道的训练,单独加载它们。
显示示例:
输出
- 图像分割。
- 图像的概率图。
- 训练有素的随机森林分类器,可用于分割任意 图像数量。
显示示例:
算法
该算法分为三步:第一步计算特征 图像中每个像素的向量。第二步训练随机森林。 此步骤使用特征向量,但也需要一些用户输入。用户 需要标记图像中的一些像素,因为它们属于某个类别 - 例如 例如:前景/背景。算法的最后一步使用经过训练的 随机森林为整个图像生成分割。
首先我们构建一个功能堆栈。 特征堆栈是通过应用预定义的过滤器图像列表来构建的。 每个图像产生一个输出图像。 这些图像被堆叠起来构建一个多特征堆栈。 特征堆栈可以看作是输入图像的多通道版本。 对于每个像素,我们现在获得多个强度值 - 每个通道一个。这些 不同的强度值构建像素的特征向量。
算法的第二步是随机森林的训练。 此步骤还需要用户的额外输入。用户已标记 图像中的一些像素属于某个类别,例如前景 或背景。该信息与之前计算的特征一起 向量用于训练随机森林。 (引用论文)
随机森林最终应用于图像中的所有像素。由 查看像素的特征向量。随机森林预测 像素属于某个类别的概率。 概率要么被写入概率图中。或者类索引 被写入输出图像以构建分割。
用于特征提取的过滤器
像素分类算法使用一组滤波器来计算像素特征。 用户可以选择使用哪些滤波器以及如何参数化它们。 有两个设置会影响所有过滤器。 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\) 像素的立方邻域。
最大滤波器/均值滤波器/方差滤波器
与最小过滤器相同,但计算平方/立方邻域的最大值/平均值/方差。