Advertisement

如何使用python脚本批量对png格式图片进行肺部CT图像的肺实质分割?

阅读量:

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注 &&收藏&&订阅!持续更新中,up!up!up!!
ps:部分题目收集来源于互联网。

全文目录:

    • 🍲问题描述

    • 🌴解决方案

      • 依赖库

      • Python 脚本:肺部CT图像肺实质分割

      • 代码解释

        • 1. 加载和处理 PNG 图片 * 2. 分割过程 * 3. 保存分割步骤图像 * 4. 批量处理 * 5. 深度学习模型(可选)
      • 运行方法

      • 注意

    • 🧧🧧 文末福利,等你来拿!🧧🧧

    • ✨️ Who am I?

🍲问题描述

根据 这篇文章的分割思路进行分割。

上面这篇文章中分割前打印出来的图片和我们要分割的png格式的图片内容相似,但是上面这篇文章的输入文件格式是.mhd和.raw,我们输入的格式是.png

我们输入的png图片长这样:

3.设计的代码可以保存每一步的分割步骤图片,最后的分割结果为这样(这两张图片不是同一张图)

如何实现一个python脚本使用该脚本可以批量对png格式图片进行肺部CT图像的肺实质分割,并且可以保存每一步的分割步骤图片(保存每一步的分割步骤图片的代码默认注释掉即可,我可以使用的时候解开注释)

🌴解决方案

如下是上述问题的解决方案,仅供参考:

在处理肺部CT图像的肺实质分割时,首先需要明确几项关键任务:

  1. 加载和处理 PNG 格式的图片
  2. 预处理 ,如去噪、增强对比度、二值化等。
  3. 使用深度学习模型或传统图像处理算法进行分割 (例如,U-Net、阈值法等)。
  4. 保存每一步的分割结果

基于如上提供的文章思路,我们可以采用类似的图像处理技术,只是需要将输入文件格式调整为 .png。我们也将利用传统的图像处理方法进行分割,同时使用深度学习模型进行更精确的分割。

下面是一个基本的 Python 脚本,能批量处理 PNG 图片,进行肺实质分割,并保存每一步的分割结果。代码中会包括图片的加载、预处理、分割和保存中间结果的步骤(可以根据需要取消注释)。

依赖库

首先,确保安装了以下 Python 库:

复制代码
    pip install numpy opencv-python scikit-image matplotlib tensorflow
    
    
      
    
  • opencv-python: 用于图像处理。
    • numpy: 用于数组处理。
    • scikit-image: 提供了很多图像处理算法,如阈值化和连通域分析。
    • matplotlib: 用于显示和保存图像。
    • tensorflowpytorch: 若你使用深度学习模型进行分割。

Python 脚本:肺部CT图像肺实质分割

复制代码
    import os
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    from skimage import measure, filters
    from tensorflow.keras.models import load_model
    from skimage.morphology import closing, square
    
    # 定义一个函数,用于加载模型(如果使用深度学习模型进行分割)
    def load_segmentation_model(model_path):
    return load_model(model_path)
    
    # 定义一个函数进行肺部CT图像分割
    def lung_segmentation(image, model=None, save_intermediate_steps=False):
    # 1. 转为灰度图
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 2. 预处理:去噪 (中值滤波)
    preprocessed_image = cv2.medianBlur(gray_image, 5)
    
    # 3. 阈值化 (Otsu's方法)
    _, thresholded = cv2.threshold(preprocessed_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # 4. 开闭运算:去除小噪声
    closed_image = closing(thresholded, square(3))
    
    if save_intermediate_steps:
        # 保存预处理图像
        cv2.imwrite("step_preprocessed.png", preprocessed_image)
        cv2.imwrite("step_thresholded.png", thresholded)
        cv2.imwrite("step_closed.png", closed_image)
    
    # 5. 连通域分析:标记肺区域
    labeled_image = measure.label(closed_image)
    
    # 6. 根据区域大小过滤噪声(可选)
    regions = measure.regionprops(labeled_image)
    for region in regions:
        if region.area < 500:  # 小于500像素的区域认为是噪声
            for coordinates in region.coords:
                labeled_image[coordinates[0], coordinates[1]] = 0
    
    # 7. 显示分割结果
    if save_intermediate_steps:
        plt.imshow(labeled_image, cmap='nipy_spectral')
        plt.title('Lung Segmentation Result')
        plt.axis('off')
        plt.savefig('step_final_segmentation.png')
    
    return labeled_image
    
    # 批量处理文件夹中的 PNG 图像
    def batch_process_images(input_folder, output_folder, model=None, save_steps=False):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # 遍历文件夹中的所有 PNG 图像
    for filename in os.listdir(input_folder):
        if filename.endswith(".png"):
            # 读取图像
            img_path = os.path.join(input_folder, filename)
            image = cv2.imread(img_path)
    
            # 分割肺部CT图像
            segmented_image = lung_segmentation(image, model=model, save_intermediate_steps=save_steps)
    
            # 保存分割结果
            output_path = os.path.join(output_folder, f"segmented_{filename}")
            cv2.imwrite(output_path, segmented_image)
    
            print(f"Processed {filename} and saved to {output_path}")
    
    # 使用深度学习模型进行肺实质分割(如有需要,使用模型)
    def deep_learning_segmentation(image, model):
    # 如果你有训练好的深度学习模型,可以在这里调用它进行分割
    # image = np.expand_dims(image, axis=0)  # 根据需要调整图像形状
    # prediction = model.predict(image)
    # return prediction
    pass
    
    if __name__ == "__main__":
    # 输入文件夹(包含 PNG 图像)
    input_folder = 'path_to_input_images'
    # 输出文件夹(保存分割结果)
    output_folder = 'path_to_output_images'
    
    # 如果你有训练好的模型,加载它
    # model = load_segmentation_model('path_to_trained_model.h5')
    
    # 批量处理图像
    batch_process_images(input_folder, output_folder, model=None, save_steps=True)
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

代码解释

1. 加载和处理 PNG 图片
  • 使用 OpenCV (cv2.imread) 加载 PNG 图片。
  • 转换为灰度图并进行去噪处理。
2. 分割过程
  • 去噪 :通过中值滤波去除图像中的噪声。
  • 阈值化 :使用 Otsu 的自动阈值法将图像二值化,确定背景和前景。
  • 开闭运算 :通过形态学操作(闭运算)去除小的噪声。
  • 连通域分析 :使用 skimage.measure.label 标记所有连通区域,并根据区域面积去除小的噪声区域。
3. 保存分割步骤图像
  • 你可以通过设置 save_intermediate_steps=True 来保存每一步的图像(预处理图像、阈值图像、闭运算图像和最终分割结果图像)。
4. 批量处理
  • batch_process_images 函数会遍历输入文件夹中的 PNG 图像,进行分割,并将分割后的结果保存到输出文件夹。
5. 深度学习模型 (可选)
  • 如果你有训练好的深度学习模型(例如,使用 U-Net 或其他分割网络),可以使用 deep_learning_segmentation 函数对图像进行分割。这个部分的代码暂时是一个占位符。

运行方法

  1. 将输入的 PNG 图片放在指定的 input_folder 中。
  2. 运行脚本后,分割后的结果会保存到 output_folder 中。
  3. 如果需要保存每一步的分割过程图像,可以在调用 batch_process_images 时将 save_steps=True

注意

  • 如果你有深度学习模型,可以加载并在 deep_learning_segmentation 函数中应用该模型进行更精确的分割。
  • 如果需要进一步优化分割效果,可以尝试使用更高级的图像处理方法,或者基于深度学习的图像分割技术(如 U-Net)。

这样,你就可以批量处理肺部CT图像的肺实质分割,并保存每一步的结果。如果你有进一步的要求或想使用更复杂的分割模型,请告诉我。

希望如上措施及解决方案能够帮到有需要的你。

PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

🧧🧧 文末福利,等你来拿!🧧🧧

如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《全栈Bug调优(实战版)》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

✨️ Who am I?

我是bug菌, | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+ ;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

全部评论 (0)

还没有任何评论哟~