gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:01:13 25 4
gpt4 key购买 nike

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

Chromatogram

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

提前致谢。

最佳答案

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

它有以下要求:

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

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

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

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()

无论您此时采取什么方法,都需要对您的数据做出假设(我实际上无法做出这些假设!尽管我在上面做了一些假设!),您如何处理重叠峰值?等等..我确信色谱法中有标准方法,所以您确实需要先检查一下。希望这有帮助!

关于c# - 科学色谱图的图像分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10366885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com