医学数字图像处理实验报告2(2023)

 

校徽标

《医学数字图像处理实验报告》

实验名称

实验二 数字图像的存取与显示

实验目的与要求

  1. PIL库的基本使用
  • 要求1:Image类的使用,打开图像,保存图像(另一种格式),能够查看图像类型(灰度或RGB),图像的尺寸;
  • 要求2:把图像转换为numpy数组,验证转换后数组的大小(shape)和数据类型(dtype)。
  • 要求3:从数组中进行通道的混合,得到全部6种混合的结果,并显示。
  1. 使用Matplotlib进行图像(数组)的显示
  • 要求1:导入matplotlib包中的pyplot子包
  • 要求2:pyplot.imshow和pyplot.show显示图像
  • 要求3:把一个数组以图像进行显示
  • 要求4:把一个数组保存为图像文件
  1. Pydicom库的基本使用:
  • 要求1:打开医学DICOM图像,查看DICOM图像的相关信息;
  • 要求2:得到DICOM图像的像素数据(数组),查看数组的大小和数据类型;
  • 要求3:查看数组的最大值和最小值,利用线性变换(点运算),将数组的范围压缩到0-255,并学习数据类型的转换。

实验过程

首先从PIL库中导入Image这个库,利用这个库打开图片,然后将其利用Image里的convert函数转化为灰度图像,然后练习了用save转化格式为.png保存图像,保存的图像如下所示,并且查看了图片的类型和尺寸如下表所示

图1保存png格式图

表1图片信息

Attributes

类型

尺寸

格式

value

RGB

(1170,1755)

JPEG

接着我们又利用numpy将导入的图片进行了转化,转为数组,并且得到数组矩阵的相关信息如下所示,

表 2 矩阵信息

Attributes

数据类型

尺寸

value

Uint8

(1170,1755,3)

之后利用numpy数组的切片操作将RGB图形生成的三层数组矩阵拆分为三个数字矩阵如下所示:

图2 拆分数字矩阵

然后又利用split函数将RGB三层分开,分割为三个灰度图像,然后根据排列组合原理,一共生成了六张R,G,B三层叠加的图片,如下所示

546312

图3 六种RGB组合图

之后我们利用matplotlib.pyplot中的plt结合show方法和imshow方法,进行图像的显示,并且如下图4,图5,图6都保存生成在本地,然后我们调整了imshow的一些属性,首先调整了cmap,颜色映射属性,我们选择了“rainbow”和“rainbow_r”进行调试,得到如下结果:

7

图 4 cmap为“rainbow”和“rainbow_r”映射下的图像

我们又调整了imshow函数里的vmin,vmax属性,调整前后两次生成随机整数范围为0~127,第一次利用默认的vmin,vmax大小,即0和255,第二次调整vmax为128,vmin为0,得到两次图像如下所示:

8

图 5 vmin = 0, vmax = 255下的随机矩阵生成图像

9

图 5 vmin = 0, vmax = 128下的随机矩阵生成图像

最后,我们利用pydicom库里的dcmread函数读取dcm格式的医学图像,得到一些图像信息,如下所示:

图 6 dicom格式图片医学信息

然后利用dcm对象里的plxel.array变量读取数字矩阵,并获取图片的类型和宽高,以及数字矩阵中的最大值,最小值,生成数据如下表所示,

表 3 医学影像信息

Attributes

类型

宽高

最大值

最小值

value

int16

(512,512)

3651

-2000

最后将图片转成的数组通过一些Hu像素的转化,使用点运算,将影像值转换为Hu值,然后通过调整vmax和vmin的属性,生成医学概念下的纵膈宽和肺部窗宽图像,对于肺部窗宽,调整之后会比之前呈现更好的亮度,而对于纵膈宽,调整之后会明显呈现一个关键部分突出的图像,如下所示

1210

图 7 肺部窗宽调整前后对比图

1110

图 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是一种映射函数需要调整的参数。

posted @ 2023-03-17 17:45  哲远甄骏  阅读(73)  评论(0)    收藏  举报