科学色谱图的图像分析

2024-09-28 03:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种从气相色谱或高效液相色谱中提取信息的方法。色谱图如下:

Chromatogram

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

提前谢谢。在


Tags: 工具方法算法信息解决方案表面图像处理色谱
2条回答

当我使用这个代码时,我得到了下面的图像

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.

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

它有以下要求:

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

它非常简单,只需迭代图像的每一列,并将第一个黑色值作为数据点。它使用PIL。这些数据点最初在image坐标系中,因此需要重新缩放到数据坐标系,如果所有图像共享同一轴,这是直接向前的,否则需要在每个图像的基础上手动完成(自动化将更复杂)。在

下面的图片显示了我从哪里提取图像(我删除了文本)以进行处理(非粉红色区域),因此为了重新缩放,我们只需在数据坐标系中选取白盒区域:x_range = 4.4 - 0.55x_offset = 0.55y_range = 23000 - 2500,和{}。在

enter image description here

以下是用pyplot重新填充的提取数据: enter image description here

代码如下:

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以上的峰值才存在,然后我们迭代数据,找到峰值,并使用梯形规则np.trapz,来找到每个峰值下的面积。在峰重叠的地方,区域在重叠点被分开(我怀疑这是标准的…)。此外,此代码将只识别局部最大值的峰值(肩部不会被检测到)。我用图表记录了结果,在相应的峰值位置写下每个峰值的面积值: enter image description here

^{pr2}$

在这一点上,无论你采取什么样的方法,都需要对你的数据进行假设(我真的无法做出这样的假设!虽然我做了一些以上!),如何处理重叠峰?等。。我相信色谱法有标准的方法,所以你真的需要先检查一下。希望这有帮助!在

相关问题 更多 >

    热门问题