首页 > 解决方案 > 在 C++ 中查找一系列数字中的重复模式

问题描述

我正在尝试为心电图、心电图、纸实现自动网格检测系统,请参见下图。背后的想法是通过逐个像素地检查心电图图像来添加像素值(仅考虑红色通道),如图所示在下面的代码中。

QImage image("C:/Users/.../Desktop/ECGProject/electrocardiogram.jpg");
std::vector<int> pixelValues;
for (int y = 0; y < img.height(); y++)
{
   int rowSumR = 0, rowSumG = 0, rowSumB = 0;
   for (int x = 0; x < img.width(); x++)
   {
       QRgb rgb = img.pixel(x, y);
       rowSumR += qRed(rgb);
   }
   rowSumR /= img.width();
   const int &value = rowSumR/4;
   pixelValues.push_back(value)
}

该向量pixelValues包含在 y 方向上具有重复模式的求和值。目标是检测那些重复的模式(例如,在心电图图像上以黑色绘制的线是兴趣或我希望在任何方向上识别的内容)。我还使用 matlab 绘制了 y 方向的总像素值(见下图),红色圆圈是我感兴趣的模式。任何找到这些重复模式的建议/算法将不胜感激。[![心电图][1]][1] [![在此处输入图像描述][2]][2]

标签: c++qt

解决方案


我在 matlab 中为您编写了以下程序:

load data.txt

y = data(:,2);
yr = resample(y,10,1);

xhat = cceps(yr);
figure(1)
subplot(2,1,1)
plot(0:length(xhat)-1,xhat)
subplot(2,1,2)
plot(0:length(yr)-1,yr)

maxima = zeros(10000,1);
cnt = 1;
for i = 2:length(xhat)-1
    
    if xhat(i-1) < xhat(i) && xhat(i+1) < xhat(i)
        maxima(cnt) = i-1;
        cnt = cnt + 1;
    end
end
maxima(cnt:end) = [];
disp(maxima(1:10)/10)

倒谱是一种信号处理工具,可以检测周期性。它实际上对信号进行去卷积。比如说,在我们的例子中,我们有一个脉冲火车和一些卷积的模式。倒谱分析将脉冲序列和模式“解耦”。脉冲序列周期导致倒谱中给定时间点的最大值。如果您运行此程序,您可以从输出中声明细粒度周期性的平均周期为 3.5 像素,而贪婪周期(您将相应的脉冲标记为红色)的平均周期为 23.4 像素(注意插值)。基于此观察,您可以尝试通过相关分析来改进脉冲的局部放置,使用语音处理中称为音高分析的技术(基于相关分析)。这最后一步可能是必要的,因为峰放置存在明显的不规则性。如果您还有其他疑问,请告诉我。


推荐阅读