c++ - 在 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]
解决方案
我在 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 像素(注意插值)。基于此观察,您可以尝试通过相关分析来改进脉冲的局部放置,使用语音处理中称为音高分析的技术(基于相关分析)。这最后一步可能是必要的,因为峰放置存在明显的不规则性。如果您还有其他疑问,请告诉我。
推荐阅读
- ios - [Swift]我无法从特定 URL 获取任何 JSON 数据
- python - 返回一个数字是否为素数作为 Python 中的布尔值
- javascript - 由于滥用状态,数组未动态更新
- ffmpeg - 从实时 youtube 流中提取帧
- javascript - 为什么此代码在松散相等而不是严格相等时正确运行?
- reactjs - 无法在 HOC 中将钩子用于功能组件
- ios - iOS提交:无效二进制:禁止指令
- google-bigquery - Bigquery中的openstreet地图数据集中缺少美国几何
- javascript - ReferenceError:logInModule 未在 HTMLElement.onclick 中定义
- mysql - 在最后一步安装 Mysql 时出现问题,需要很长时间