使用 python 从图像中删除 CT 床

Removing CT bed from image using python

我想从图像中删除 CT 床。基本上我想删除此图像和后续图像中红线以下的所有内容(我会填充 0 个零或其他内容)

有没有办法得到最大的非零数在y轴上的位置?或者最长水平非零数的高度?然后我可以将下面的所有值替换为零。或者有更好的方法吗?谢谢!

我从

获取图像数据
df = pydicom.dcmread(img)
plt.imshow(df.pixel_array, vmax=dicom_max_pixel)
plt.show()

IIUC,看看下面这个最小的例子:

首先,我们导入模块。

import matplotlib.pyplot as plt
import numpy as np

创建示例图像,1 代表床。

image = np.zeros((10, 10))
image[6, 2:8] = image[7, 4:6] = 1
print(image)
plt.imshow(image)
plt.show()

它打印并显示:

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 1. 1. 1. 1. 1. 0. 0.]
 [0. 0. 0. 0. 1. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

我们用np.all to find out for each line if it is all zeros. Afterwards, we use np.where得到第一个False的索引。

zero_lines = np.all(image == 0, axis=1)
first_false = np.where(zero_lines == False)[0][0]
print(zero_lines)
print(first_false)

这会打印:

[ True  True  True  True  True  True False False  True  True]
6

我们使用此信息相应地裁剪图像。

image = image[:first_false]
print(image)
plt.imshow(image)
plt.show()

它打印并显示:

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

我仍然同意上面的观点,但这是我尝试过的方式。

#loading image
single_image = image[1,:,:]
single_image_2 = single_image.copy()
#using np.where
single_image_bi = binary_image_2(single_image_2)
single_image_pd = pd.DataFrame(single_image_bi)
#summing across row
single_image_sum = pd.DataFrame(np.sum(single_image_pd, axis=1))
#find index
max_index = single_image_sum.idxmax()
print(f"max_index: {max_index}")

plt.imshow(single_image[0:max_index[0]:,:])
plt.show()

我的 VS 上面的方式(不是 2/7 之一)

def binary_image_2(img, threshold=.04):
    single_image = img
    print(np.shape(single_image))
    nn, mm = np.shape(single_image)
    for n in range(nn):
            single_image[n, :] = np.where(single_image[n, :]> threshold*single_image.max(),
                                           1, 0)