科学色谱图像分析

时间:2012-04-28 19:37:39

标签: c# python image analysis

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

Chromatogram

我并不是真的进行图像处理/分析,所以我正在寻找一种工具/算法来从这些色谱图中提取峰的长度(如果可能的话,还有峰下的表面)。解决方案可以是Python或C#。

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

它有以下要求:

  • 图像干净(没有文字或其他数据)。
  • 曲线是单值的,即。曲线像素宽度为1(如果没有这个,它仍然可以工作,但它总是取上限值)。
  • 比例是线性的。

它非常简单,只是遍历图像的每一列,并将第一个黑色值作为数据点。它使用PIL。这些数据点最初位于image坐标系中,因此需要重新调整到数据坐标系,如果所有图像共享同一轴,这是直截了当的,否则需要完成基于每个图像手动(自动化将更多涉及)。

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

enter image description here

以下是使用pyplot重新绘制的提取数据: enter image description here

以下是代码:

y_offset = 2500

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

我做了几个假设并编写了一些简单的代码(下面),以说明一种可能的方法。我已经对数据进行了阈值处理,因此只有高于5000的峰存活,然后我们遍历查找峰值的数据,并使用空心规则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() 来查找每个峰下面的区域。在峰重叠的地方,区域在重叠点被分开(我怀疑这是标准的......)。此代码也只能识别局部最大值的峰值(不会检测到肩峰)。我已经绘制了结果,在相应的峰值位置写下每个峰的面积值: enter image description here

np.trapz

此时您采取的任何方法都需要对您的数据进行假设(我实际上无法做出这些假设!虽然我上面做了一些!),您如何处理重叠峰?等等。我相信色谱中有标准的方法,所以你需要先检查一下。希望这有帮助!

答案 1 :(得分:-1)

使用此代码时,我得到以下图片

created image

代码与上面的相同(略有修改)

from PIL 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 range(width):
        for y in range(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('C:\Python\HPLC.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()

I am not quite sure what the problem might be.