点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9vdzZwcnpadVBJRU5iMG01aWF3dXRJZjkwTjJVYjNkY1B1UDJLWEhKdmFSMUZ2MkZuaWNUdU95M0tjSHVJRUpiZDlsVXlPaWJlWHFXOHRFaG9KR0w5OHFPdy82NDA?x-oss-process=image/format,png)
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL3N6X21tYml6X2pwZy80QXFTRW5OVWVyaWJROFJLWWdmY2dRZlU1MlRUZmp3UDg3Y1NpYnVJS054QXV2WDhaZjF4OUxCRnlFc29YbmU1MFZFaWJRS0ZqMmRwRWxsazM1NGc0YUN6US82NDA?x-oss-process=image/format,png)
本期我们将一起来实现一个有趣的问题 -图像分割的算法。
本文的示例代码可以在以下链接中找到:
https://github.com/kiteco/kite-python-blog-post-code/tree/master/image-segmentation
作为我们的例子,我们将对KESM显微镜获取的图像进行分割以获取其中的血管组织。
数据科学家和医学研究人员可以将这种方法作为模板,用于更加复杂的图像的数据集(如天文数据),甚至一些非图像数据集中。由于图像在计算机中表示为矩阵,我们有一个专门的排序数据集作为基础。在整个处理过程中,我们将使用 Python 包,以及OpenCV、scikit 图像等几种工具。除此之外,我们还将使用 numpy ,以确保内存中的值一致存储。
主要内容
去噪
为了消除噪声,我们使用简单的中位数滤波器来移除异常值,但也可以使用一些不同的噪声去除方法或伪影去除方法。这项工件由采集系统决定(显微镜技术),可能需要复杂的算法来恢复丢失的数据。工件通常分为两类:
1. 模糊或焦点外区域
2. 不平衡的前景和背景(使用直方图修改正确)
分割
对于本文,我们使用Otsu 的方法分割,使用中位数滤波器平滑图像后,然后验证结果。只要分段结果是二进制的,就可以对任何分段算法使用相同的验证方法。这些算法包括但不限于考虑不同颜色空间的各种循环阈值方法。
一些示例包括:
1. 李阈值
2. 依赖于局部强度的自适应阈值方法
3. 在生物医学图像分割中常用的Unet等深度学习算法
4. 在语义上对图像进行分段的深度学习方法
验证
我们从已手动分割的基础数据集开始。为了量化分段算法的性能,我们将真实数据与预测数据的二进制分段进行比较,同时显示准确性和更有效的指标。尽管真阳性 (TP) 或假阴性 (FN) 数量较低,但精度可能异常高。在这种情况下,F1 分数和 MCC是二进制分类的更好量化指标。稍后我们将详细介绍这些指标的优缺点。
为了定性验证,我们叠加混淆矩阵结果,即真正的正极、真负数、假阳性、假负数像素正好在灰度图像上。此验证也可以应用于二进制图像分割结果上的颜色图像,尽管本文中使用的数据是灰度图像。最后,我们将介绍整个实现过程。现在,让我们看看数据和用于处理这些数据的工具。
Loading and visualizing data
我们将使用以下模块加载、可视化和转换数据。这些对于图像处理和计算机视觉算法非常有用,具有简单而复杂的数组数学。如果单独安装,括号中的模块名称会有所帮助。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL3N6X21tYml6X3BuZy80QXFTRW5OVWVyaWJROFJLWWdmY2dRZlU1MlRUZmp3UDhoelZ0aWJiaWNMUXRLUHN1ZGdoSldEcW91a0pRNTNiOVVYdUVjRnBXa0JhVEloN1llbzdpYlJXaWN3LzY0MA?x-oss-process=image/format,png)
如果在运行示例代码中,遇到 matplotlib 后端的问题,请通过删除 plt.ion() 调用来禁用交互式模式,或是通过取消注释示例代码中的建议调用来在每个部分的末尾调用 plt.show()。"Agg"或"TkAgg"将作为图像显示的后端。绘图将显示在文章中。
代码导入
import cv2
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc
import scipy.ndimage
import skimage.filters
import sklearn.metrics
# Turn on interactive mode. Turn off with plt.ioff()
plt.ion()
在本节中,我们将加载可视化数据。数据是小老鼠脑组织与印度墨水染色的图像,由显微镜(KESM)生成。此 512 x 512 图像是一个子集,称为图块。完整的数据集为 17480 x 8026 像素,深度为 799,大小为 10gb。因此,我们将编写算法来处理大小为 512 x 512 的图块,该图块只有 150 KB。
各个图块可以映射为在多处理/多线程(即分布式基础结构)上运行,然后再缝合在一起即获得完整的分段图像。我们不介绍具体的缝合方法。简而言之,拼接涉及对整个矩阵的索引并根据该索引将图块重新组合。可以使用map-reduce进行,Map-Reduce的指标例如所有图块的所有F1分数之和等。我们只需将结果添加到列表中,然后执行统计摘要即可。
左侧的黑色椭圆形结构是血管,其余的是组织。因此,此数据集中的两个类是:
• 前景(船只)—标记为255
• 背景(组织)—标记为0
右下方的最后一个图像是真实图像。通过绘制轮廓并填充轮廓以手动方式对其进行追踪,通过病理学家获得真实情况。我们可以使用专家提供的类似示例来训练深度学习网络,并进行大规模验证。我们还可以通过将这些示例提供给其他平台并让他们以更