我正在处理三维CT图像,并试图从床上移除线条。
原始图像中的一个片段:

下面是生成掩码的代码:
segmentation = morphology.dilation(image_norm, np.ones((1, 1, 1)))
labels, label_nb = ndimage.label(segmentation)
label_count = np.bincount(labels.ravel().astype(int))
label_count[0] = 0
mask = labels == label_count.argmax()
mask = morphology.dilation(mask, np.ones((40, 40, 40)))
mask = ndimage.morphology.binary_fill_holes(mask)
mask = morphology.dilation(mask, np.ones((1, 1, 1)))这将产生以下图像:

正如你所看到的,在上面的图像中,CT扫描也是扭曲的。
如果我将:mask = morphology.dilation(mask, np.ones((40, 40, 40)))更改为mask = morphology.dilation(mask, np.ones((100, 100, 100))),则生成的映像如下:

如何在不改变图像区域的情况下只删除图像下的两条线?任何帮助都是非常感谢的。
发布于 2022-08-08 14:25:00
你可能已经找到另一个解决方案了。无论如何,我已经在SO上看到过类似的CT处理问题,并且认为演示Scikit-Image解决方案会有帮助。这是最终结果。

这是生成上述图像的代码。
from skimage import io, filters, color, morphology
import matplotlib.pyplot as plt
import numpy as np
image = color.rgba2rgb(
io.imread("ctimage.png")[9:-23,32:-9]
)
gray = color.rgb2gray(image)
tgray = gray > filters.threshold_otsu(gray)
keep_mask = morphology.remove_small_objects(tgray,min_size=463)
keep_mask = morphology.remove_small_holes(keep_mask)
maskedimg = np.einsum('ijk,ij->ijk',image,keep_mask)
fig,axes = plt.subplots(ncols=3)
image_list = [image,keep_mask,maskedimg]
title_list = ["Original","Mask","Imgage w/mask"]
for i,ax in enumerate(axes):
ax.imshow(image_list[i])
ax.set_title(title_list[i])
ax.axis("off")
fig.tight_layout()关于代码的注释
image = color.rgba2rgb(
io.imread("ctimage.png")[9:-23,32:-9]
)
gray = color.rgb2gray(image)当我从其中加载RGBA时,该映像被保存为RGBA。它需要在灰度中用于阈值函数。你的图像可能已经在灰度上了。此外,下载的图像显示轴标记。所以我才剪掉了这张照片。
maskedimg = np.einsum('ijk,ij->ijk',image,keep_mask)我想将keep_mask应用到RGB映像的每个通道。掩码是二维阵列,图像是三维阵列。为了将掩码应用到图像中,我引用了这个previous question。
https://stackoverflow.com/questions/72943438
复制相似问题