使用 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)
我想从图像中删除 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)