如何从 ECG 图像中恢复信号

信息处理 图像处理
2022-01-15 03:21:13

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

前

我想得到这样的东西:-

后

然后是数字化数据(x,y 点),就像这个关于心电图数字化的视频一样

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

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

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

你能指导我如何做到这一点(我使用的是 MATLAB 2010)吗?任何帮助,将不胜感激。

2个回答

抱歉,我使用 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"]]
  ]
 ]

请注意,我裁剪了您图像的右侧,因为那里完全是白色的。结果是

现在你可以加入这些点或以你喜欢的任何方式插入它们,你就可以得到你的 EEG

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

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

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

对于额外的点,您可以设置跟踪可以从列更改多少的限制,以允许您发现随机点或噪声尖峰。