医学数字图像处理实验报告2(2023)
《医学数字图像处理实验报告》
实验名称 |
实验二 数字图像的存取与显示 |
||||||||||||||||||||||||
实验目的与要求 |
|
||||||||||||||||||||||||
实验过程 |
首先从PIL库中导入Image这个库,利用这个库打开图片,然后将其利用Image里的convert函数转化为灰度图像,然后练习了用save转化格式为.png保存图像,保存的图像如下所示,并且查看了图片的类型和尺寸如下表所示 图1保存png格式图 表1图片信息
接着我们又利用numpy将导入的图片进行了转化,转为数组,并且得到数组矩阵的相关信息如下所示, 表 2 矩阵信息
之后利用numpy数组的切片操作将RGB图形生成的三层数组矩阵拆分为三个数字矩阵如下所示: 图2 拆分数字矩阵 然后又利用split函数将RGB三层分开,分割为三个灰度图像,然后根据排列组合原理,一共生成了六张R,G,B三层叠加的图片,如下所示 图3 六种RGB组合图 之后我们利用matplotlib.pyplot中的plt结合show方法和imshow方法,进行图像的显示,并且如下图4,图5,图6都保存生成在本地,然后我们调整了imshow的一些属性,首先调整了cmap,颜色映射属性,我们选择了“rainbow”和“rainbow_r”进行调试,得到如下结果: 图 4 cmap为“rainbow”和“rainbow_r”映射下的图像 我们又调整了imshow函数里的vmin,vmax属性,调整前后两次生成随机整数范围为0~127,第一次利用默认的vmin,vmax大小,即0和255,第二次调整vmax为128,vmin为0,得到两次图像如下所示: 图 5 vmin = 0, vmax = 255下的随机矩阵生成图像 图 5 vmin = 0, vmax = 128下的随机矩阵生成图像 最后,我们利用pydicom库里的dcmread函数读取dcm格式的医学图像,得到一些图像信息,如下所示: 图 6 dicom格式图片医学信息 然后利用dcm对象里的plxel.array变量读取数字矩阵,并获取图片的类型和宽高,以及数字矩阵中的最大值,最小值,生成数据如下表所示, 表 3 医学影像信息
最后将图片转成的数组通过一些Hu像素的转化,使用点运算,将影像值转换为Hu值,然后通过调整vmax和vmin的属性,生成医学概念下的纵膈宽和肺部窗宽图像,对于肺部窗宽,调整之后会比之前呈现更好的亮度,而对于纵膈宽,调整之后会明显呈现一个关键部分突出的图像,如下所示 图 7 肺部窗宽调整前后对比图 图 8 纵膈宽调整前后对比图 相关处理代码如下所示:1 import matplotlib.pyplot as plt 2 from PIL import Image 3 4 img = Image.open('./images/1.jpg') 5 6 img.show() 7 8 grayimg = img.convert("L") 9 10 grayimg.show() 11 12 img = Image.open('./images/kun.jpg') 13 14 print(f'格式:{img.format},类型:{img.mode}, 尺寸:{img.size}') 15 16 img.save('./tmp/kun.png') 17 18 img.show() 19 20 import numpy as np 21 22 imgar=np.array(img) 23 24 print(imgar.shape, imgar.dtype) 25 26 list1 = ['R','G','B'] 27 28 for i, j in zip(range(imgar.shape[2]),list1): 29 30 print(j,"层数字矩阵为:") 31 32 print(imgar[:,:,i]) 33 34 r,g,b = img.split() 35 36 r 37 38 # r.show() 39 40 list1 = [b, g, r] 41 42 cnt = 0 43 44 for i in list1: 45 46 for j in list1: 47 48 for z in list1: 49 50 if(i != j and j != z and i != z): 51 52 cnt = cnt + 1 53 54 colorimg = Image.merge("RGB", (i, j, z)) 55 56 colorimg.save(f'./tmp/{cnt}.png') 57 58 import numpy as np 59 60 #如果去掉dtype='uint8'的参数,观察结果 61 62 imgar=np.random.randint(0,256,(100,256),dtype='uint8') 63 64 print(f'数组的高宽深为{imgar.shape}') 65 66 img1=Image.fromarray(imgar) 67 68 print(f'图像的类型是:{img1.mode}, 图像的宽高是{img1.size}') 69 70 img1.show() 71 72 img=Image.open('./images/1.jpg') 73 74 grayimg = img.convert("L") 75 76 plt.imshow(grayimg, cmap ='rainbow_r') 77 78 plt.savefig('./tmp/7.png') 79 80 plt.show() 81 82 print(f'图像的格式是:{img.format},图像的类型是:{img.mode}, 图像的宽高是{img.size}') 83 84 img.format, img.mode, img.size 85 86 imgarray = np.random.randint(0,128, (100, 256), dtype="uint8") 87 88 plt.imshow(imgarray,cmap = "rainbow") 89 90 plt.savefig('./tmp/8.png') 91 92 plt.imshow(imgarray, cmap = "rainbow", vmin = 0, vmax = 255) 93 94 plt.savefig('./tmp/9.png') 95 96 !pip install pydicom -i https://pypi.douban.com/simple/ 97 98 from pydicom import dcmread 99 100 img=dcmread('./images/IMG00157.dcm') 101 102 img.file_meta 103 104 ar=img.pixel_array 105 106 print(f'图像的类型是:{ar.dtype}, 图像的高宽是{ar.shape}' ) 107 108 print(ar.max(),ar.min()) 109 110 !python.exe -m pip install --upgrade pip -i https://pypi.douban.com/simple/ 111 112 plt.imshow(ar, cmap = "gray") 113 114 plt.savefig('./tmp/10.png') 115 116 #使用点运算,将影像值,转换为Hu值 117 118 hu_ar = ar * img.RescaleSlope + img.RescaleIntercept 119 120 #纵膈窗 121 122 ww=400 123 124 wl=40 125 126 plt.imshow(hu_ar,cmap='gray',vmin=wl-ww/2,vmax=wl+ww/2,interpolation='nearest') 127 128 plt.savefig('./tmp/11.png') 129 130 plt.show() 131 132 #肺部窗宽1 300 Hu - 1 700 Hu,窗位-600 Hu - -800 Hu, 133 134 ww=1500 135 136 wl=-700 137 138 plt.imshow(hu_ar,cmap='gray',vmin=wl-ww/2,vmax=wl+ww/2,interpolation='nearest') 139 140 plt.savefig('./tmp/12.png') 141 142 plt.show()
|
||||||||||||||||||||||||
结果分析 |
图像的叠加有了初步的了解,对于医学图像的一些处理,比如说dicom格式的图片转化为数据有了一定了解,对之后课程中处理更多的医学影像打下基础,并且对一些函数的功能有了了解,比如说save, matplotlib.pyplot里的imshow和show搭配显示图像,同时对一些函数的参数或者属性有了一定了解,比如说vmax,vmin,还有cmap是一种映射函数需要调整的参数。 |