首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

学习记录:python 编程-批量将dicom格式转变为jpg格式图片(详细解释)

  • 23-09-26 04:21
  • 2224
  • 8618
blog.csdn.net

部署环境

 import SimpleITK as sitk 
 import numpy as np 
 import cv2 import os
 import time from PIL 
 import Image`
  • 1
  • 2
  • 3
  • 4
  • 5

先放全套代码

count = 1
path = "/Users/pingguogongyongji1/Desktop/test"
filename = os.listdir(path)
print filename
    for i in filename:
        document = os.path.join(path,i)
        outputpath = "/Users/pingguo/Desktop/output/"
        countname = str(count)
        countfullname = countname + '.jpg'
        output_jpg_path = os.path.join(outputpath,countfullname)
        
        def convert_from_dicom_to_jpg(img,low_window,high_window,save_path):
            lungwin = np.array([low_window*1.,high_window*1.])
            newimg = (img-lungwin[0])/(lungwin[1]-lungwin[0]) 
            newimg = (newimg*255).astype('uint8')
            cv2.imwrite(save_path, newimg, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
                
        if __name__ == '__main__':

            ds_array = sitk.ReadImage(document)   
            img_array = sitk.GetArrayFromImage(ds_array)   
       
            shape = img_array.shape#name.shape
            img_array = np.reshape(img_array, (shape[1], shape[2])) 
            high = np.max(img_array)
            low = np.min(img_array)
            convert_from_dicom_to_jpg(img_array, low, high, output_jpg_path)  
            print('FINISHED')

        count = count + 1

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

先说一下大体结构
主体是个for循环
因为要对批量遍历导入的目标dicom文件挨个处理
输出文件名(包括路径)的话,用一个简单的计数器即可搞定

        def convert_from_dicom_to_jpg(img,low_window,high_window,save_path):
  • 1

这是定义了一个函数convert_from_dicom_to_jpg,有四个可输入值的口
先说一下这个包含最关键动作的函数吧

            lungwin = np.array([low_window*1.,high_window*1.])
            newimg = (img-lungwin[0])/(lungwin[1]-lungwin[0])    #归一化
            newimg = (newimg*255).astype('uint8')                #将像素值扩展到[0,255]
            cv2.imwrite(save_path, newimg, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
  • 1
  • 2
  • 3
  • 4

前三行就不说了:归一化和线性调整灰度值到0~255,数据类型转换astype
cv2.imwrite函数!将矩阵保存为jpeg或png格式
有三个参数可以输入:
第一个输入路径,这里要注意,路径得包含后缀名!
比如:path=/Users/pingguo/Desktop/test/1
这样是不行的,我曾在这里绊倒过
正解:
path=/Users/pingguo/Desktop/test/1.jpg
第二个是输入矩阵啊
就是含有文件内容数值的矩阵变量
第三个是不同文件的调整
jpeg的话是控制一下图片的质量,默认是95,0~100越高越好
png的话是压缩级别,0~10,级别越高图像越小

            convert_from_dicom_to_jpg(img_array, low, high, output_jpg_path)   
  • 1

在此处运行该函数

往下走看到这个if语句

        if __name__ == '__main__':
  • 1

一般老练有经验的会写一句这样的控制如何运行python脚本的语句
当该模块被直接运行时,才可以运行以下语句
当模块被import到其他模块中,被if判断识别出来,中断运行
but whatever 它对你转换格式影响不大

            img_array = np.reshape(img_array, (shape[1], shape[2]))  #获取array中的height和width
  • 1

这里有个reshape函数
全称是numpy.reshape来自numpy库
执行的动作是将一个矩阵reshape
比如,36的矩阵reshape成29的
当然前提是不改变矩阵大小

跳出中间部分,回到一开始的dicom文件路径和output jpg图片路径
这是很关键的一个地方

filename = os.listdir(path)
  • 1

可以看到第三行使用了个os.listdir函数
这个函数可以列出路径下所有文件的文件名,并传递给filename变量
如果你的PC和我一样是mac.os,那这里要注意了!
它遍历当前路径时会读取一个奇怪的东西:.DS_Store
然而我翻到目标文件夹查看并没有这个文件
搜一下才知道这是Finder 用来存储这个文件夹的显示属性的
总之没用且影响我们干活!
删!

打开terminal
cd 目标路径
rm .DS_Store
alright!

可见for循环里有个路径拼接函数

      output_jpg_path = os.path.join(outputpath,countfullname)
  • 1

这可不是简单的字符串拼接,它会在括号里面的变量间加/
也就是说你千万不能

        outputpath = "/Users/pingguo/Desktop/output/"
        countname = '1'
        formatname = ‘.jpg’
        output_jpg_path = os.path.join(outputpath,countname,formatname)
  • 1
  • 2
  • 3
  • 4

这样输出一下output_jpg_path就是
/Users/pingguo/Desktop/output/1/.jpg

所以正解就是先用个拼接语句,将他们拼成一个变量

    outputpath = "/Users/pingguo/Desktop/output/"
    countname = '1'
    countfullname = countname + '.jpg'
    output_jpg_path = os.path.join(outputpath,countfullname)
  • 1
  • 2
  • 3
  • 4

你也许注意到了

        countname = str(count)
  • 1

这是个强制类型转换
注意我们原来的count变量可是个数值,可不是字符串
需要转换一下类型

that’s all
搬砖愉快~

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览338369 人正在系统学习中
注:本文转载自blog.csdn.net的Fred_inputting的文章"https://blog.csdn.net/u011764992/article/details/84501300"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top