如何从心电图图像恢复信号


14

在我的项目中,我必须数字化使用普通相机(jpeg)拍摄的ECG图像。例如,我有以下相机捕获的图像:

之前

我想得到这样的东西:

后

然后是数字化的数据(x,y点),如本视频中有关ECG的数字化

我不知道该怎么做,所以我搜索并查阅了几篇研究论文。算法的一般方法是:

  1. 更改为灰度图像
  2. 删除网格线
  3. 添加缺失点
  4. 将2D图像转换为1D图像

我坚持第二点,即删除网格线。我查找了更多参考资料以进行此操作,发现直方图分析可能会有所帮助。

您能否指导我如何执行此操作(我正在使用MATLAB 2010)?任何帮助,将不胜感激。


我在这里问基本相同的问题:stackoverflow.com/q/1657941/125507
endolith 2012年

@ Deepak,好像您已经实现了帖子中提到的代码的matlab部分,能否与您分享将扫描图像转换为一维信号以进行插值的matlab部分
user3278 2012年

Answers:


16

抱歉,我使用Mathematica,但是将其实现到Matlab中应该真的很容易。无论如何,我都会给出代码,所以当我的描述不够详细时,您可以从代码中获取其余内容。

基本思想是:按列查看图像。分别处理像素的每一列。请注意,在绘图中,我反转了灰度值。因此,黑色为1,白色为0。
如果绘制(反转的)亮度像素值,则基本上只有两种情况。第一个是,当您的列不在垂直网格线上时。情节看起来像

第二种情况是,您直接在垂直网格线上。然后,网格线会影响整个列的亮度

但是您看到的是,您的黑暗脑电图似乎总是最大的。因此,非常复杂的算法是:遍历每一列并确定最黑像素的位置。

img = ColorConvert[
   ImagePad[
    Import["http://i.stack.imgur.com/500Kg.jpg"], {{0, -20}, {0, 0}}],
    "Grayscale"];

Image[
 Transpose[Function[With[{m = Min[#]},
     Map[Function[{v}, If[v == m, 1, 0]], #]]] /@ 
   Transpose[ImageData[img, "Real"]]
  ]
 ]

请注意,我在图像的右侧部分进行了裁切,因为此处完全是白色的。结果是

现在,您可以按照自己喜欢的任何方式加入或插入点,从而获得脑电图


@帕特里克:我喜欢这个主意!
乔纳斯(Jonas)2012年

请注意,这仅在网格线是直线且平行于图像轴的情况下才有效
endolith 2012年

@endolith,您已经尝试过了,对吗?因为在这里,它在图像未精确对齐时起作用。顺便说一句,当网格线不是水平/垂直时,则删除网格线的整个过程是完全没有用的,因为对于旋转的图像,EEG的{x,y}值会错误。
halirutan 2012年

@帕特里克:我的意思是如果数据不与像素的坐标对齐,您将无法获得正确的x,y值。
endlith 2012年

@Patrick您的算法工作很不错:)并且我已经成功提取了信号,但是在插值信号时仍然有些困难(因为我对图像处理非常陌生),请帮助我如何插值信号?再次感谢:)
Deepak 2012年

5

您有一个彩色图像,其中的网格线为红色,迹线为黑色。因此,只需忽略任何红色像素!

如果不能确定图像是否完全对齐,则可以使用网格线来计算偏斜(右移时,图像的斜率以像素/像素为单位)。

然后将黑色迹线转换为1d值很简单。从第一列的左边缘开始,找到黑色像素(或一组相连的小像素的质心)-垂直位置就是您的值。
对图像中的每一列执行此操作。
如果您缺少一个值,则需要在已知值之前和之后进行内插。

对于额外的点,您可以设置迹线从列到列的变化量限制,以允许您发现随机的点或噪声尖峰。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.