首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科学色谱的图像分析

科学色谱的图像分析
EN

Stack Overflow用户
提问于 2012-04-29 03:37:39
回答 2查看 3.3K关注 0票数 1

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

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-29 17:28:59

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

它有以下要求:

  • 图像是干净的(没有文本或其他数据)。
  • 曲线是单值的,即。曲线像素宽度为1(没有该值仍可用,但始终取上限值)。
  • Scale是线性的。

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

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

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

代码如下:

代码语言:javascript
复制
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,找到每个峰下的面积。在峰重叠的地方,区域在重叠点处被分割(我怀疑这是标准的..)。此外,此代码将仅识别属于局部最大值的峰值(不会检测到肩部)。我已经绘制了结果图,在相应的峰值位置写下了每个峰值的面积值:

代码语言:javascript
复制
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()

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

票数 3
EN

Stack Overflow用户

发布于 2018-11-09 05:04:12

当我使用这段代码时,我得到了以下图像

代码同上(稍加修改)

代码语言:javascript
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10366885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档