luna16ラベルデータのxyzとdicom.ImagePositionPatientの3つの値は、それぞれ、軸の初期点を表します

最初のコードでは、dicom.ImagePositionPatientの3つの値がどの軸を表しているかを見てみましょう。xはOrigin [0]に対応し、yはOrigin [1]に対応し、zはOrigin [2]に対応することに注意してください。Originのソースは次のコードです:追記:内部のいくつかの事柄が私を大いに悩ませました。ここでは、将来の混乱を防ぐために頭がはっきりしたときに私の理解を記録します。

最初に写真を見て、CTがどのように撮影されるかを見てみましょう。

したがって、最初にZ軸を見るのではなく、X軸とY軸を見るだけで、Xが列で、Yが行であることがわかります。これは、私たちが通常地図上に描くものと非常によく似ています。画像参照:https//www.cnblogs.com/h2zZhou/p/9072967.html

dicom.ImagePositionPatientは、デバイスによって生成されたdicomから直接読み取られるため、dicom.ImagePositionPatientの3つの値は、X軸、Y軸、およびZ軸の初期点を表します。Xは列で、Yは行であることに注意する必要があります。

luna16ラベルデータのxyzを見てみましょう。以前のブログ投稿https://blog.csdn.net/qq_36401512/article/details/85163467を使用して、ラベルを2次元で視覚化しました。詳細はご自身で確認できます。2つのコードのみを確​​認します。

 x, y, z = int((nodules[idx, 0]-Origin[0])/SP[0]), int((nodules[idx, 1]-Origin[1])/SP[1]),
 int((nodules[idx, 2]-Origin[2])/SP[2])
# 注意 y代表纵轴,x代表横轴
data[max(0, y - radius):min(data.shape[0], y + radius),
max(0, x - radius - pad):max(0, x - radius)] = 3000  # 竖线
data[max(0, y - radius):min(data.shape[0], y + radius),
min(data.shape[1], x + radius):min(data.shape[1], x + radius + pad)] = 3000  # 竖线
data[max(0, y - radius - pad):max(0, y - radius),
max(0, x - radius):min(data.shape[1], x + radius)] = 3000  # 横线
data[min(data.shape[0], y + radius):min(data.shape[0], y + radius + pad),
max(0, x - radius):min(data.shape[1], x + radius)] = 3000  # 横线

xは小結節[idx、0]に対応し、yは小結節[idx、1]に対応し、zは小結節[idx、2]に対応することがわかります。次の段落でラベルをマークする方法は、大きな値を割り当てることです。ただし、yは垂直軸を表し、xは水平軸を表すという注記があります。上記のコードの最初の行にあるy関連のパラメーターを、データが割り当てられたときの最初の次元として見ると、上記のコメントがさらに確認されます。

たとえば、2次元行列Aが点(x1、y1)に割り当てられてA [x1、y1]を表すことがわかっています。絵を描くときに、点(x1、y1)にマークを付ける場合は、次のコードが必要です。

plt.ion()
plt.scatter(y1, x1, marker='o', color='red', s=10, label='First')
plt.imshow(A, cmap=plt.cm.bone)

それでもあいまいな場合は、xがOrigin [0]に対応し、yがOrigin [1]に対応し、zがOrigin [2]に対応する最初のコードを見てみましょう。Originの取得は次のコードです。

filename='E:\\JLS\\dcm_data\\luna\\subset1\\1.3.6.1.4.1.14519.5.2.1.6279.6001.173106154739244262091404659845.mhd'
itkimage = sitk.ReadImage(filename)#读取.mhd文件
Origin=itkimage.GetOrigin()

また、itkimage.GetOrigin()は、このCTシーケンスの最初のダイコムのImagePositionPatientと同じです。このように、luna16のラベルデータはdicom.ImagePositionPatientで表される軸と同じであり、coordYは列を表し、coordXは行を表すことがわかります。

 

 

PS:2019.11.6ブログの結論は3回書かれています、一般的なプロセス:それはこのようです、それが逆にされなければ、それはまだこのようです。最後に、正確さを確保するために、luna16データと現在のプロジェクトのデータを使用して、ラベルに従って結果を描画するように再度記述しました。具体的なコードは次のとおりです。

# coding=UTF-8
import cv2
import numpy as np
from PIL import Image
from scipy import misc
import os
import sys
import cv2
from skimage import measure, morphology, segmentation
import matplotlib.pyplot as plt

import SimpleITK as sitk
import pandas

MIN_BOUND = -1000.0
MAX_BOUND = 400.0


def normalize(image):
    image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
    image[image > 1] = 1.
    image[image < 0] = 0.
    return image

def load_itk_image(filename):
    with open(filename) as f:
        contents = f.readlines()
        line = [k for k in contents if k.startswith('TransformMatrix')][0]
        transformM = np.array(line.split(' = ')[1].split(' ')).astype('float')
        transformM = np.round(transformM)
        if np.any(transformM != np.array([1, 0, 0, 0, 1, 0, 0, 0, 1])):
            isflip = True
        else:
            isflip = False

    itkimage = sitk.ReadImage(filename)
    numpyImage = sitk.GetArrayFromImage(itkimage)

    numpyOrigin = np.array(list(reversed(itkimage.GetOrigin())))
    numpySpacing = np.array(list(reversed(itkimage.GetSpacing())))

    return numpyImage, numpyOrigin, numpySpacing, isflip


F_path='Tannotations.csv'
L_path='annotations.csv'
F='/FORNEWTEST/change/NewForTest'
L='dcm_data/luna/subsets'

annosF = np.array(pandas.read_csv(F_path))
annosL = np.array(pandas.read_csv(L_path))

nameF = annosF[0][0]
nameL = annosL[55][0]
coordXF,coordYF,coordZF=annosF[0][1],annosF[0][2],annosF[0][3]
coordXL,coordYL,coordZL=annosL[55][1],annosL[55][2],annosL[55][3]
print(nameF,nameL)

for root, dirs, files in os.walk(F):
    for file in files:
        if (file[:-4] == nameF and file[-4:] == '.mhd'):
            sliceim, origin, spacing, isflip = load_itk_image(
                        os.path.join(root, file))
            ZF=np.absolute(coordZF-origin[0])/spacing[0]
            YF=np.absolute(coordYF-origin[1])/spacing[1]
            XF = np.absolute(coordXF - origin[2]) / spacing[2]
            imgF=sliceim[ZF]
            plt.ion()
            plt.scatter(XF, YF, marker='o', color='red', s=10, label='First')
            plt.imshow(imgF, cmap=plt.cm.bone)
            plt.show()

for root, dirs, files in os.walk(L):
    for file in files:
        if (file[:-4] == nameL and file[-4:] == '.mhd'):
            sliceim, origin, spacing, isflip = load_itk_image(os.path.join(root, file))
            ZL=int(np.absolute(coordZL-origin[0])/spacing[0])
            YL=np.absolute(coordYL-origin[1])/spacing[1]
            XL = np.absolute(coordXL - origin[2]) / spacing[2]
            imgL=sliceim[ZL]
            imgC=imgL[YL-20:YL+20,XL-20:XL+20]
            plt.ion()
            plt.scatter(XL, YL, marker='o', color='red', s=2, label='First')
            plt.imshow(imgL, cmap=plt.cm.bone)
            plt.show()
            plt.imshow(imgC, cmap=plt.cm.bone)
            plt.show()

今、アイデアはついに非常に明確になりました。百聞は一見に如かず!

おすすめ

転載: blog.csdn.net/qq_36401512/article/details/102921085