【问题标题】:Isolating the head in a grayscale CT image using Python使用 Python 在灰度 CT 图像中隔离头部
【发布时间】:2019-10-06 20:00:02
【问题描述】:

我正在处理包含患者头部但也包含金属圆柱体“阴影”的 CT 图像。

这些“阴影”可以出现在下方、左侧或右侧。在上图中,它仅出现在图像的下侧。在下图中,它出现在左右方向。我没有任何关于图像中是否有圆柱体阴影的先验知识。我必须以某种方式检测并删除它。然后我可以继续分割头骨/头部。

为了创建一个可重现的示例,我想提供代表图像的 numpy 数组 (128x128),但我不知道如何将其上传到 stackoverflow。

我怎样才能实现我的目标?

我尝试使用 ndimage 和 scikit-image 进行分割,但它不起作用。我得到的片段太多了。



12 张原始图片

12 张图片二值化

剥离的 12 张图像(膨胀、腐蚀 = 0.1、0.1)

用红色标记的图像不能帮助创建一个矩形遮罩,将头骨包裹起来,这是我的最终目标。

请注意,在应用算法期间,我将无法一张一张地检查图像。

【问题讨论】:

  • 你对盾牌和头骨有什么价值?
  • 接近 1。我将尝试使用二值化图像的 kmeans 并从那里获取。
  • 你可以利用膨胀和腐蚀来创建一个不包含细细细节的面具,比如盾牌,但仍然可以让你看到头骨。如果您提供一些没有装饰的图像(轴、网格等),我可以展示一些代码来说明这个想法。
  • 谢谢,我将不胜感激!请看我更新的帖子。我已经对图像进行了二值化。现在我需要一种方法来隔离头骨。这应该在我不检查图像的情况下完成。如前所述,图像中可能存在其他边缘,应将其移除,因为它们不属于患者的头部。
  • 最后它通过使用较低的二值化阈值来工作。谢谢!!!

标签: python-3.x image image-processing scikit-image ndimage


【解决方案1】:

您可以结合使用腐蚀(具有适当的迭代次数)来移除细部细节,然后使用膨胀(也具有适当的迭代次数)将非细部细节恢复到大约原始大小。

在代码中,这看起来像:

import io
import requests

import numpy as np
import scipy as sp
import matplotlib as mpl
import PIL as pil

import scipy.ndimage
import matplotlib.pyplot as plt


# : load the data
url = 'https://i.stack.imgur.com/G4cQO.png'
response = requests.get(url)
img = pil.Image.open(io.BytesIO(response.content)).convert('L')
arr = np.array(img)
mask_arr = arr.astype(bool)

# : strip thin objects
struct = None
n_erosion = 6
n_dilation = 7
strip_arr = sp.ndimage.binary_dilation(
    sp.ndimage.binary_erosion(mask_arr, struct, n_erosion),
    struct, n_dilation)

plt.imshow(mask_arr, cmap='gray')
plt.imshow(strip_arr, cmap='gray')
plt.imshow(mask_arr ^ strip_arr, cmap='gray')

从这张图片开始(mask_arr):

人们会看到这张图片 (strip_arr):

区别在于 (mask_arr ^ strip_arr):


编辑

(解决 cmets 中提出的问题)

使用不同的输入图像,例如使用低得多的阈值对输入进行二值化处理,将有助于获得在侵蚀过程中不会消失的头部更大且非细的细节。

或者,您可以通过将椭圆拟合到头部来获得更可靠的结果。

【讨论】:

  • 这真的很好,但我需要更多帮助。请查看更新后的帖子,其中显示 12 张灰度 CT 图像,转换为 12 张二值化图像,然后再剥离为 12 张图像。
  • @user8270077 公平地说,我会寻找确切的对象,而不是进行通用图像处理。它是患者头部的表格,在给定的医院/设置中,只有一种形状或非常有限的形状可以存在,并且它们只能位于图像的特定区域。我会从那开始,而不是腐蚀、膨胀等。
【解决方案2】:

我建议使用不同的方法(实际上是两种),而不是像上面的 Ander Biguri 那样“纯”图像处理。

这里的概念是不依赖于纯粹的算法图像处理,而是利用您所拥有的具体情况的知识:

1) 鉴于容器是金属的(如您所说),另一种可能更容易的方法是根据金属框架的特定 HU 数进行阈值处理。

虽然您将图像显示为简单的灰度,但实际上 CT 图像是 16 位图像,当以 256 位灰度表示查看时,这些图像是窗口水平的 - 所以上面的图片并不是图像中可用完整信息的真实表示数据,实际上是 16 位的。

金属框架的 HU 值可能与解剖结构中的任何东西都显着不同(高于)。如果是这种情况,那么简单的阈值化然后减法会简单得多删除它的方法。

2) 另一种方法也将基于考虑您所拥有的特定情况的几何形状和属性:

在上面的图像中,您可以在图像中间(按列)向上查看垂直轮廓以找到框架的位置 - 该位置是垂直轮廓与 HU 值相交的点匹配框架。

从那时起,您可以使用泛洪填充方法(例如scikit flood_fill)来查找特定容差范围内的所有连接点。

这也将为您提供一组与框架相匹配的点(掩码),您可以使用这些点将其从原始图像中移除。


我认为对于您提出的情况,这两种方法中的任何一种都会更快、更稳健。

【讨论】:

    猜你喜欢
    • 2022-08-08
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多