科学色谱图的图像分析 - c#

我正在寻找一种从GC或HPLC色谱图中提取信息的方法。色谱图如下所示:

我不是很专心于图像处理/分析,因此我正在寻找一种工具/算法来从这些色谱图中提取峰的长度(如果可能,还包括峰的表面)。解决方案可以使用Python或C#。

提前致谢。

参考方案

我已经编写了一些快速的python代码,这些代码将从图像文件中提取色谱图(或任何单值)数据。

它具有以下要求:

图像干净(无文本或其他数据)。
曲线是单值的,即。曲线像素宽度为1(如果没有此设置,它将仍然有效,但始终取最大值)。
比例是线性的。

这非常简单,只需遍历图像的每一列并以第一个黑色值作为数据点即可。它使用PIL。这些数据点最初位于image坐标系中,因此需要重新缩放为数据坐标系,如果所有图像共享同一轴,这很简单,否则需要在每个图片的基础上(自动化会更多)。

下图显示了我提取图像的位置(删除了文本)以进行处理(非粉红色区域),因此,为了进行重新缩放,我们只将数据坐标系中的白框区域取为:x_range = 4.4 - 0.55,,x_offset = 0.55y_range = 23000 - 2500

这是用pyplot重新绘制的提取数据:

这是代码:

import Image
import numpy as np

def get_data(im, x_range, x_offset, y_range, y_offset):
    x_data = np.array([])
    y_data = np.array([])
    width, height = im.size
    im = im.convert('1')
    for x in xrange(width):
        for y in xrange(height):
            if im.getpixel((x, y)) == 0:
                x_data = np.append(x_data, x)
                y_data = np.append(y_data, height - y)
                break
    x_data = (x_data / width) * x_range + x_offset
    y_data = (y_data / height) * y_range + y_offset
    return x_data, y_data

im = Image.open('clean_data_2.png')
x_data, y_data = get_data(im,4.4-0.55,0.55,23000-2500,2500)

from pylab import *
plot(x_data, y_data)
grid(True)
savefig('new_data.png')
show()

将数据作为numpy数组后,可以使用许多选项来查找峰及其下的相应区域(有关某些方法,请参见this讨论)。噪声是一个大问题,因此通常的方法是对数据进行卷积以消除噪声(如果峰很尖,则可以设置阈值),然后进行区分以找到峰。要查找峰下面积,您可以对峰区域进行数值积分。

我做了一些假设,并编写了一些简单的代码(如下),以说明一种可能的方法。我对数据进行了阈值处理,因此只有5000个以上的峰可以保留,然后我们遍历数据以查找峰,并使用空中飞人规则y_offset = 2500查找每个峰下的面积。峰重叠的区域在重叠点被分开(我怀疑这是标准的..)。同样,此代码将仅识别出局部最大值的峰(将不会检测到肩峰)。我将结果绘制成图形,在相应的峰位置写入每个峰的面积值:

def find_peak(start, grad):
    for index, gr in enumerate(grad[start:]):
        if gr < 0:
            return index + start

def find_end(peak, grad):
    for index, gr in enumerate(grad[peak:]):
        if gr >= 0:
            return index + peak + 1

def find_peaks(grad):
    peaks=[]
    i = 0
    while i < len(grad[:-1]):
        if grad[i] > 0:
            start = i
            peak_index = find_peak(start, grad)
            end = find_end(peak_index, grad)
            area = np.trapz(y_data[start:end], x_data[start:end])
            peaks.append((x_data[peak_index], y_data[peak_index], area))
            i = end - 1
        else:
            i+=1
    return peaks

y_data = np.where(y_data > 5000, y_data, 0)

grad = np.diff(y_data)

peaks = find_peaks(grad)

from pylab import *
plot(x_data, y_data)    
for peak in peaks:
    text(peak[0], 1.01*peak[1], '%d'%int(peak[2]))
grid(True)
show()

此时,无论采用哪种方法,都需要对数据进行假设(虽然我确实做不到这一点!尽管我在上面做过一些!),如何处理重叠峰?等等。我敢肯定色谱法中有标准方法,所以实际上您需要先检查一下。希望这可以帮助!

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

从Azure Data Factory执行python脚本 - python

有人可以帮我从Azure数据工厂执行python函数吗?我已经将python函数存储在blob中,并且我试图触发同样的功能。但是我无法做到这一点。请协助。第二,我可以从ADF参数化python函数调用吗? python参考方案 您可能会发现ADF中的Azure Function Activity概念,它允许您在Data Factory管道中运行Azure F…

自动更新ext.data.store上的新数据 - php

我有这个extjs数据存储 mystore= Ext.create('Ext.data.Store', { id: 'store_id', fields: ['label', 'value', 'id', 'type'], autoLoad…

更新System.Data.SQLite.dll后,SQLite无效URI - c#

我首先有以下SQLite版本:1.0.77.0(sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.77.0)而且一切正常。将System.Data.SQLite.dll更新到版本1.0.82.0(sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.82.0)…

尝试将Python与photos.capture_image()结合使用以进行Kairos注册API - python

我目前正在使用Kairos API,并试图使用Pythonista在我的iPad上拍摄一张新照片,然后将该照片上传到Kairos enroll API。我能够使它与URL图像一起正常工作,但是我一生无法通过使用photos模块拍摄照片来使其正常工作。根据我的理解,photos模块返回一个PIL图像,我认为在上传到Kairos API之前需要对它进行base6…