import os
import pydicom
import SimpleITK as sitk
import numpy as np
import cv2
dcm_path = '路径' # 绝对路径
def read_dicom_data(file_name):
file = sitk.ReadImage(file_name)
data = sitk.GetArrayFromImage(file)
data = np.squeeze(data, axis=0)
data = np.int32(data)
dicom_dataset = pydicom.dcmread(file_name)
slice_location = dicom_dataset.SliceLocation
return data, data.shape[0], data.shape[1], slice_location
def change_to_lung_window(img_data):
img_data[img_data < -1000] = -1000
img_data[img_data > 500] = 500
# 纵隔窗模式
# img_data[img_data < -150] = -150
# img_data[img_data > 250] = 250
return img_data
def find_max_region(mask_sel):
__, contours,hierarchy = cv2.findContours(mask_sel,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
#找到最大区域并填充
area = []
for j in range(len(contours)):
area.append(cv2.contourArea(contours[j]))
max_idx = np.argmax(area)
max_area = cv2.contourArea(contours[max_idx])
for k in range(len(contours)):
if k != max_idx:
cv2.fillPoly(mask_sel, [contours[k]], 0)
return mask_sel
pixel_array, rows, columns, slice_location = read_dicom_data(dcm_path)
pixel_array = change_to_lung_window(pixel_array)
imageData = (pixel_array - pixel_array.min()) * 255.0 / (pixel_array.max() - pixel_array.min())
imageData = np.uint8(imageData)
cv2.imshow('CT', imageData)
cv2.waitKey()
__, mask = cv2.threshold(imageData, 127, 255, 0)
cv2.imshow('Binary', mask)
cv2.waitKey()
mask_max_region = find_max_region(mask)
cv2.imshow('Max Region', mask_max_region)
cv2.waitKey()
h, w = mask_max_region.shape[:2]
mask_tp = np.zeros((h+2, w+2), np.uint8)
temp = mask_max_region.copy()
temp2 = mask_max_region.copy()
cv2.floodFill(temp, mask_tp, (1, 1), 255)
cv2.floodFill(temp2, mask_tp, (w - 2, h - 2), 255)
temp2[temp > 0] = 255
rt = cv2.bitwise_not(temp)
temp2[temp2 == 0] = 1
temp2[temp2 == 255] = 0
mask_max_region[temp2 > 0] = 255
image_process = np.uint8((mask_max_region / 255) * imageData)
cv2.imshow('Result', image_process)
cv2.waitKey()
CT医学图像去床
最新推荐文章于 2024-08-15 21:31:09 发布