Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用Python在灰度CT图像中分离头部_Python 3.x_Image_Image Processing_Scikit Image_Ndimage - Fatal编程技术网

Python 3.x 使用Python在灰度CT图像中分离头部

Python 3.x 使用Python在灰度CT图像中分离头部,python-3.x,image,image-processing,scikit-image,ndimage,Python 3.x,Image,Image Processing,Scikit Image,Ndimage,我处理的是CT图像,包括患者头部,但也包括金属圆柱体的“阴影” 这些“阴影”可以向下、向左或向右显示。在上面的图像中,它仅显示在图像的下方。在下图中,它显示在左右方向。我不知道图像中是否有圆柱体的阴影。我必须设法发现它并把它移走。然后我可以继续分割头骨/头部 为了创建一个可复制的示例,我想提供表示图像的numpy数组(128x128),但我不知道如何将其上载到stackoverflow 我怎样才能达到我的目标 我尝试用ndimage和scikit图像进行分割,但不起作用。我得到的片段太多了

我处理的是CT图像,包括患者头部,但也包括金属圆柱体的“阴影”

这些“阴影”可以向下、向左或向右显示。在上面的图像中,它仅显示在图像的下方。在下图中,它显示在左右方向。我不知道图像中是否有圆柱体的阴影。我必须设法发现它并把它移走。然后我可以继续分割头骨/头部

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

我怎样才能达到我的目标

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



12张原始图像

对12幅图像进行二值化处理

剥离的12幅图像(膨胀,侵蚀=0.1,0.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\u arr
):

你可以看到这张图片(
strip\u arr
):

区别在于(
mask\u arr^strip\u arr
):


编辑 (处理评论中提出的问题)

例如,使用不同的输入图像,以更低的阈值对输入进行二值化,将有助于获得更大、更薄的头部细节,这些细节在侵蚀过程中不会消失


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

您可以使用侵蚀(具有适当的迭代次数)的组合来删除薄细节,然后进行膨胀(也具有适当的迭代次数)以将非薄细节恢复到近似原始大小

在代码中,这看起来像:

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\u arr
):

你可以看到这张图片(
strip\u arr
):

区别在于(
mask\u arr^strip\u arr
):


编辑 (处理评论中提出的问题)

例如,使用不同的输入图像,以更低的阈值对输入进行二值化,将有助于获得更大、更薄的头部细节,这些细节在侵蚀过程中不会消失

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

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

这里的概念不是单纯依靠算法图像处理,而是利用您对具体情况的了解:

1) 假设容器是金属的(如您所述),另一种可能容易得多的方法就是根据金属框架的特定HU编号设置阈值

虽然您将图像显示为简单灰度,但实际上CT图像是16位图像,在256bit灰度表示中查看时窗口水平-因此,上面的图片不是图像数据中可用全部信息的真实表示,实际上是16位

金属框架的HU值可能与解剖结构中的任何东西都有显著不同(高于)。如果是这种情况,那么简单的阈值分割然后减法将是一种更简单的去除方法

2) 另一种方法还将基于考虑您的特定情况的几何结构和特性:

在上面的图像中,你可以在图像的中间向上看垂直剖面(列),以找到框架的位置-位置是垂直轮廓交叉到与帧匹配的胡数值的点。 从这一点开始,您可以使用泛洪填充方法(eg)查找特定公差范围内的所有连接点

这还将为您提供一组与帧匹配的点(遮罩),您可以使用这些点将其从原始图像中移除


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

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

这里的概念不是单纯依靠算法图像处理,而是利用您对具体情况的了解:

1) 假设容器是金属的(如您所述),另一种可能容易得多的方法就是根据金属框架的特定HU编号设置阈值

虽然您将图像显示为简单灰度,但实际上CT图像是16位图像,在256bit灰度表示中查看时窗口水平-因此,上面的图片不是图像数据中可用全部信息的真实表示,实际上是16位

金属框架的HU值可能与解剖结构中的任何东西都有显著不同(高于)。如果是这种情况,那么简单的阈值分割然后减法将是一种更简单的去除方法

2) 另一种方法还将基于考虑您的特定情况的几何结构和特性:

在上面的图片中,您可以看到