如何使用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图像的肺实质分割时,首先需要明确几项关键任务:
- 加载和处理 PNG 格式的图片 。
- 预处理 ,如去噪、增强对比度、二值化等。
- 使用深度学习模型或传统图像处理算法进行分割 (例如,U-Net、阈值法等)。
- 保存每一步的分割结果 。
基于如上提供的文章思路,我们可以采用类似的图像处理技术,只是需要将输入文件格式调整为 .png。我们也将利用传统的图像处理方法进行分割,同时使用深度学习模型进行更精确的分割。
下面是一个基本的 Python 脚本,能批量处理 PNG 图片,进行肺实质分割,并保存每一步的分割结果。代码中会包括图片的加载、预处理、分割和保存中间结果的步骤(可以根据需要取消注释)。
依赖库
首先,确保安装了以下 Python 库:
pip install numpy opencv-python scikit-image matplotlib tensorflow
opencv-python: 用于图像处理。numpy: 用于数组处理。scikit-image: 提供了很多图像处理算法,如阈值化和连通域分析。matplotlib: 用于显示和保存图像。tensorflow或pytorch: 若你使用深度学习模型进行分割。
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函数对图像进行分割。这个部分的代码暂时是一个占位符。
运行方法
- 将输入的 PNG 图片放在指定的
input_folder中。 - 运行脚本后,分割后的结果会保存到
output_folder中。 - 如果需要保存每一步的分割过程图像,可以在调用
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-
