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



,我想得到这样的东西:-



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

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


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

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

评论

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

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

#1 楼

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

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



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



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

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"]]
  ]
 ]


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



现在,您可以按照自己喜欢的任何方式加入点或对它们进行插值,然后获得脑电图


/>

评论


$ \ begingroup $
@Patrick:我喜欢这个主意!
$ \ endgroup $
–乔纳斯(Jonas)
2012年1月3日19:23

$ \ begingroup $
请注意,这仅在网格线为直线且平行于图像轴的情况下有效
$ \ endgroup $
– Endolith
2012年1月3日在21:09

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

$ \ begingroup $
@Patrick:我的意思是,如果数据未与像素坐标对齐,则您将无法获得正确的x,y值。
$ \ endgroup $
– Endolith
2012年1月4日17:41

$ \ begingroup $
@Patrick您的算法已经工作了:),我已经成功提取了信号,但是在插值信号时仍然遇到一些困难(因为我对图像处理非常陌生),请帮助我如何插值信号?再次感谢 :)
$ \ endgroup $
– Deepak
2012年1月5日,12:51

#2 楼

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

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

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

对于额外的点,您可以设置跟踪可以从列到列的变化量的限制,以使您能够斑点随机点或噪声尖峰。