基于双阈值的形态学分水岭分割算法批量分割dicom图像利用python,举个完整的例子
时间: 2024-06-01 15:12:54 浏览: 107
基于分水岭算法的图像分割方法
4星 · 用户满意度95%
很高兴回答你的问题。基于双阈值的形态学分水岭分割算法是一种常用的图像分割方法,可以进行dicom图像的批量分割。下面是一个完整的例子:
1.首先,导入所需的Python库和dicom文件。
import numpy as np
import cv2
import os
import dicom
2.然后,定义一个函数来读取dicom图像,并将其转换为灰度图像。
def read_dicom_image(filename):
ds = dicom.read_file(filename)
img = ds.pixel_array.astype(float)
img = cv2.normalize(img, None, 0.0, 255.0, cv2.NORM_MINMAX)
img = np.uint8(img)
return img
3.接下来,使用双阈值分割算法进行图像分割。
def threshold_image(img):
ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
sure_bg = cv2.dilate(opening, kernel, iterations=3)
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers + 1
markers[unknown == 255] = 0
markers = cv2.watershed(img, markers)
img[markers == -1] = [255, 0, 0]
return img
4.最后,遍历文件夹中的所有dicom图像,并逐个应用上述函数进行分割。
def segment_folder(foldername):
for filename in os.listdir(foldername):
filepath = os.path.join(foldername, filename)
if os.path.isfile(filepath) and filepath.endswith('.dcm'):
img = read_dicom_image(filepath)
segmented_img = threshold_image(img)
cv2.imwrite(f'segmented_{filename}.png', segmented_img)
我们可以通过调用segment_folder函数来处理一个dicom图像文件夹,并将分割结果保存为PNG文件。
阅读全文