用java程序读取心电图数据并绘制成图片

首先了解一下心电图纸的构成,首先背景是由1mm*1mm的小方格填充的。然后每5个小方格组成 一个大方格,像下面图所示就是心电图的一部分展示效果。心电图在上面绘制的时候 ,横向代表时间(s),纵向代表电压(mv)。

用java程序读取心电图数据并绘制成图片

 

如果心电图进纸速度是25mm/s(大多数设备是这样的,其他速度也无所谓,后面根据这个参数计算就行了)

那么重点来了,我们知道在心电图数据中有一个increment参数,这个是步进的意思,一般是0.001秒。那么每次步进的距离就是25mm*0.001=0.025mm,如果我们每个小方格是1mm(也就是大方格是5mm),我们在绘制曲线的时候 ,x 轴每次移动就是0.025mm。但我们在计算机中的单位是像素,因此需要将每次的步进换算成像素。这里分两种处理方法介绍:

方法一使用分辨率:假如我们使用72像素/英寸的分辨率(这也是网页中常用的,打印机用的300的)。那么72像素/英寸换算成毫米的话就是72/25.4=2.83464像素(px)/毫米(mm),接着上面的步进计算每次步进距离为:0.025mm*2.83464px/mm=0.07像素(px)。也就是说每次绘制的时候x轴移动距离为0.07像素。(这时的小方格宽度是1mm=2.83464像素)

方法二:相对尺寸,我们假如定义小方格就是12像素(用它代表1mm的长度),那么每次步进的距离就是:0.025mm*12=0.3像素。

两种方式区别在于小方格的尺寸,如果不考虑打印的话,用方法二展示图片感觉更简单。

说完了x轴,下面看看y轴。

上面了解到increment参数影响了x 轴的步进,其实y轴也有一个类似的参数。我们命名为mm_Per_mV。它的作用就是代表纵向距离中一mv(毫伏)的高度是多少毫米。

用java程序读取心电图数据并绘制成图片

 

比如上面的心电图中箭头位置有个40mm/mv,这是代表着1mv纵向距离为40mm。好了,就是这个值是我们绘制曲线的核心点,下面看一下我们心电图数据的内容(截取部分):

<code code="MDC_ECG_LEAD_AVF" codeSystem="2.16.840.1.113883.6.24" codeSystemName="MDC" />

<value xsi:type="SLIST_PQ">

<origin value="0" unit="uV" />

<scale value="1" unit="uV" />

<digits>-19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -19 -20 -21 -21 -21 -21 -22 -22 -22 -22 -22 -22 -22 -22 -22 -22 -22 -22 -21 -21 -20 -21 -20 -20 -20 -20 -20 -20 -20 -20 -21 -21 -22 -22 -23 -24 -24 -25 -25 -26 -26 -26 -26 -27 -27 -27 -27 -27 -27 -27 -27 -27 -27 -26 -26 -26 -26 -26 -26 -27 -27 -28 -28 -29 -30 -31 -31 -31 -31 -31 -30 -30 -28 -27 -25 -23 -21 -20 -18 -17 -16 -15 -15 -16 -17 -19 -21 -23 -26 -29 -31 -34 -36 -38 -40 -42 -43 -44 -45 -45 -45 -45 -46 -46 -46 -46 -47 -48 -49 -50 -51 -52 -53 -55 -56 -57 -58 -59 -60 -61 -62 -63 -63 -64 -64 -64 -64 -64 -64 -65 -65 -66 -67 -67 -69 -70 -71 -72 -73 -74 -75 -76 -76 -76 -75 -74 -72 -70 -68 -65 -61 -57 -53 -49 -45 -41 -36 -33 -29 -26 -22 -19 -17 -14 -13 -11 -9 -8 -7 -5 -4 -3 -1 0 1 3 6 9 12 15 19 23 27 31 36 41 45 49 53 56 59 61 63 64 64 64 63 61 59 58 55 53 51 49 48 47 46 46 45 46 46 46 46 44 43 40 37 32 26 19 12 3 -5 -14 -23 -32 -40 -49 -56 -63 -68 -73 -77 -81 -83 -85 -86 -87 -88 -89 -90 -91 -91 -92 -94 -95 -96 -98 -99 -100 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -114 -114 -115 -116 -116 -116 -117 -117 -117 -117 -118 -118 -118 -118 -119 -119 -120 -120 -121 -121 -121 -121 -120 -118 -117 -116 -114 -114 -114 -114 -116 -119 -123 -129 -136 -143 -152 -161 -170 -179 -188 -197 -205 -213 -219 -225 -229 -232 -233 -233 -230 -225 -217 -205 -190 -171 -147 -118 -84 -44 1 52 109 169 235 303 372 443 513 581 645 704 757 802 838 864 880 884 877 858 827 786 734 674 605 531 452 370 288 207 128 55 -12 -72 -124 -168 -202 -227 -244 -253 -256 -252 -244 -233 -220 -205 -191 -177 -165 -154 -145 -137 -132 -127 -123 -121 -118 -115 -112 -109 -106 -103 -100 -96 -93 -91 -88 -86 -85 -83 -83 -83 -83 -83 -84 -84 -84 -84 -83 -82 -81 -79 -78 -76 -74 -72 -71 -69 -68 -66 -65 -64 -62 -61 -60 -58 -57 -57 -56 -56 -55 -55 -55 -55 -55 -55 -54 -54 -54 -54 -53 -53 -52 -52 -51 -50 -50 -50 -49 -49 -48 -48 -47 -47 -46 -46 -45 -44 -43 -42 -40 -39 -37 -36 -35 -33 -32 -31 -30 -29 -28 -27 -27 -26 -25 -24 -23 -22 -20 -19 -17 -15 -13 -11 -9 -7 -4 -2 0 1 3 4 7 8 11 13 15 17 20 23 25 28 31 34 37 40 43 46 49 53 56 59 62 66 69 73 78 82 86 91 95 100 105 110 115 120 124 129 133 138 142 146 151 155 159 164 168 173 178 182 187 191 196 200 204 208 212 215 218 220 223 225 227 229 231 232 234 235 237 238 240 241 242 243 243 244 244 244 244 243 242 241 239 238 236 233 231 228 224 221 217 213 209 204 199 193 188 182 176 170 163 156 150 143 136 130 123 117 111 104 98 93 87 82 77 71 67 61 57 52 47 42 37 33 28 24 19 15 11 7 3 0 -3 -6 -9 -12 -15 -18 -21 -23 -26 -28 -30 -31 -33 -35 -36 -38 -39 -41 -42 -42 -43 -44 -45 -46 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -55 -56 -57 -57 -57 -57 -57 -57 -57 -56 -56 -55 -55 -54 -54 -53 -53 -53 -53 -53 -53 -53 -53 -54 -54 -54 -54 -54 -54 -54 -55 -55 -55 -56 -56 -56 -57 -57 -57 -57 -57 -57 -56 -55 -54 -52 -50 -48 -45 -42 -40 -37 -34 -32 -29 -27 -26 -25 -24 -24 -24 -25 -25 -26 -27 -28 -30 -31 -32 -33 -34 -35 -35 -35 -36 -35 -35 -35 -35 -34 -34 -34 -33 -33 -33 -32 -32 -32 -31 -31 -31 -31 -31 -31 -30 -30 -29 -29 -29 -28 -28 -27 -27 -26 -26 -25 -25 -25 -25 -24 -25 -25 -25 -25 -25 -25 -25 -25 -25 -24 -24 -24 -23 -23 -23 -23 -23 -24 -25 -25 -27 -28 -29 -30 -31 -31 -32 -31 -31 -30 -29 -27 -25 -22 -20 -17 -15 -13 -11 -10 -9 -9 -9 -10 -12 -14 -17 -19 -22 -25 -27 -30 -32 -34 -37 -38 -40 -41 -43 -44 -46 -47 -48 -50 -52 -53 -55 -56 -57 -58 -59 -60 -60 -60 -60 -60 -60 -60 -60 -60 -60 -60 -60 -60 -61 -62 -62 -63 </digits>

</value>

上面代码中scale 元素的value是指定纵向比例,单位是uv(微伏)。digits元素中就是心电数据了。我们需要将它们在y轴上绘制出来。正面给一下计算方法:

我们以上面的40mm/mv为例:上面心电数据我们依次排列显示在图上,首先取一个数-19。

看下图,我们定义好中心线,向下的就是负数,向上的就是正数。大概显示效果就是下面的黑点所示。

用java程序读取心电图数据并绘制成图片

 

但如果我们不处理数据就直接原封不动的显示在图上的话,会有些问题。可以看看上面的数据从个位数到几百不等。我们需要让数据显示更友好一些,比如固定在4个大方格的高度中。这里我们就把电压数据按照上面的40mm/mv来进行转换。具体公式如下:

float dfy=((float)d/1000f)*40;//d就是心电图的数据,如上面的-19,-30等。除以1000的原因是心电图数据中的单位是uv,而纵向的单位是mv。

int gridSize=12;//1mm所代表的像素值

int scale=1;//显示比例,假如为2的话,纵向显示的会更加陡峭一些。

dfy=dfy*gridSize* scale;//将上面心电数据换算成像素

这样就将心电中的电压数据换算成了像素,剩下工作就简单了,将x,y坐标的像素值在电脑中绘制即可了。

最后看一下程序运行的效果图:

用java程序读取心电图数据并绘制成图片

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值