zy7_oldserver
1
fd601de
import numpy as np
import nibabel as nib
import nrrd
def extract_roi(ct_image, center_x=256, center_y=256, length=300, width=300):
"""
Extract a Region of Interest (ROI) from the CT image.
Parameters:
ct_image (numpy.ndarray): The CT image data as a 3D NumPy array.
center_x (int): X-coordinate of the center of the ROI.
center_y (int): Y-coordinate of the center of the ROI.
length (int): Length of the square ROI.
width (int): Width of the square ROI.
Returns:
numpy.ndarray: The ROI extracted from the CT image.
"""
half_length = length // 2
half_width = width // 2
start_x = max(0, center_x - half_length)
end_x = min(ct_image.shape[0], center_x + half_length)
start_y = max(0, center_y - half_width)
end_y = min(ct_image.shape[1], center_y + half_width)
return ct_image[:, start_x:end_x, start_y:end_y]
def calculate_contrast(ct_image):
"""
Calculate the contrast of a CT image.
Parameters:
ct_image (numpy.ndarray): The CT image data as a 3D NumPy array.
Returns:
float: The contrast of the CT image.
"""
# Assuming the CT image data ranges from -1024 to 3071 (typical Hounsfield Units range for CT scans)
min_value = -1024.0
max_value = 3071.0
#ct_image_roi=extract_roi(ct_image, center_x=0, center_y=0, length=300, width=300)
#ct_image_roi_mean=np.mean(ct_image_roi)
contrast = np.abs((np.max(ct_image) - np.min(ct_image))) / (max_value - min_value)
return contrast
def calculate_standard_deviation(ct_image):
"""
Calculate the standard deviation of CT values in the image.
Parameters:
ct_image (numpy.ndarray): The CT image data as a 3D NumPy array.
Returns:
float: The standard deviation of CT values.
"""
return np.std(ct_image)
import matplotlib.pyplot as plt
def plot_ct_value_distribution(ct_image):
"""
Plot the distribution of CT values in the image.
Parameters:
ct_image (numpy.ndarray): The CT image data as a 3D NumPy array.
"""
# Flatten the 3D array to a 1D array to get all CT values.
ct_values = ct_image.flatten()
# Create the histogram of CT values.
plt.hist(ct_values, bins=100, range=(-1024, 3071), color='blue', alpha=0.7)
plt.xlabel('CT Value')
plt.ylabel('Frequency')
plt.title('Distribution of CT Values')
plt.grid(True)
plt.show()
def ct_windowing(ct_image, window_width, window_level):
"""
Apply CT windowing to the CT image.
Parameters:
ct_image (numpy.ndarray): The CT image data as a 3D NumPy array.
window_width (float): The window width.
window_level (float): The window level.
Returns:
numpy.ndarray: The CT image data after applying windowing.
"""
# Calculate the lower and upper bounds of the window.
lower_bound = window_level - window_width / 2.0
upper_bound = window_level + window_width / 2.0
# Clip the CT values within the window bounds.
ct_image_windowed = np.clip(ct_image, lower_bound, upper_bound)
return ct_image_windowed
def main():
# Replace 'your_ct_image.nii' with the path to your NIfTI CT image file.
pcct_path = r'D:\Data\dataNeaotomAlpha\Nifti\2511\2511_2.nii.gz'
cbct_path = r'D:\Data\M2OLIE_Phantom\pre_cbct.nrrd'
nifti_file_path = pcct_path
nrrd_file_path = cbct_path
# Load the NIfTI CT image data using nibabel.
ct_image_nifti = nib.load(nifti_file_path)
ct_image_data = ct_image_nifti.get_fdata()
#ct_image_data, header = nrrd.read(nrrd_file_path)
window_width = 150
window_level = 30
#plot_ct_value_distribution(ct_image_data)
ct_image_data = ct_windowing(ct_image_data, window_width, window_level)
#plot_ct_value_distribution(ct_image_data)
# cut roi
center_x = ct_image_data.shape[0] // 2
center_y = ct_image_data.shape[1] // 2
ct_image_roi=extract_roi(ct_image_data, center_x=center_x, center_y=center_y, length=300, width=300)
ct_image_roi_mean=np.mean(ct_image_roi)
# Calculate contrast and standard deviation of CT values.
contrast = calculate_contrast(ct_image_data)
std_deviation = calculate_standard_deviation(ct_image_data)
print(ct_image_data.shape)
print("size of ROI:", ct_image_roi.shape)
print("Mean of CT values in ROI:", ct_image_roi_mean)
print("Contrast of CT image:", contrast)
print("Standard Deviation of CT values:", std_deviation)
if __name__ == "__main__":
main()