2017-04-07 197 views
0

我想使用Matlab从绘图中提取曲线。我想选择我想要提取的曲线的颜色,然后输出它们的坐标。我意识到完成这个相对图很复杂,所以我需要的只是像素位置。从那里我可以分析他们对应的内容。提供了一个示例图像,我想在其中取出红色曲线,并将其位置输出到文本文件。使用Matlab从PNG中绘制数据

Phonon Spectrum

一个非常好的补充,这将是“曲线拟合”提取的像素。提取的图形值很可能来自您的数字数据将具有宽度的+5像素宽度曲线。平均这种行为并减少数据是理想的。

Data and Desired Data

红是一个曲线上的像素,蓝色被代替待提取的有效像素。我认为这是通过两种方式完成的:对图像进行转换,然后提取值,反之亦然。我不确定哪个更好。

+0

你会意识到他们会在扫描线才能出来?我指的是图像第一行的所有红色像素,然后是第二行的所有红色像素,等等。 –

+0

@MarkSetchell那么,在MATLAB中按列顺序。摩根船长,看起来像这个图表与'Img(:,:,1)&〜Img(:,:,2)'很合拍。你所有的图表都会变得如此的漂亮整洁吗? – beaker

+0

它在Matlab中可行,但如果这是一次性任务,我建议使用Web应用程序“WebPlotDigitizer”,您可以在其中以高精度手动执行此操作。如果使用Matlab进行制作,相交的红线会让你的生活变得更加复杂。 – brainkz

回答

1

与Mark Setchell几乎相同的解决方案,但现在在Matlab中。

I = imread('DoEvE.png'); 
% select the red pixels 
Ired = I(:,:,1) == 255 & I(:,:,2) == 0 & I(:,:,3) == 0; 
figure 
imshow(Ired) 
[x, y] = find(Ired); % extract the (x, y) coordinates of the red pixels 
hold on 
plot(y, x, 'b.'); % plot the result to validate 

enter image description here

+0

看起来更容易 - 棒极了! –

+0

哦,哇!这看起来比我想象的要容易。非常感谢你。 –

+0

下一步要做的就是将这些曲线以'宽度'转换为离散数据。使所需颜色的每个像素都很好,因为简单的转换将使其适合图形值,但能够为数据做曲线拟合的形式将是惊人的。 –

1

由于没有人似乎提供了一种Matlab方法,我提供了一种基于ImageMagick的方法,可能适用于您。它安装在大多数Linux发行版上,可免费用于macOS和Windows。

在终端(Windows上的命令提示符)中的以下命令将拍摄您的图像,关闭透明度并填充不在red的10%范围内的黑色所有像素。

magick plot.png -alpha off -fuzz 10% -fill black +opaque red result.png 

enter image description here

如果我们这样做完全一样的事情了,但随后将图像转换为文字是这样的:

magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: 

我们会得到这样的:

# ImageMagick pixel enumeration: 650,455,65535,srgb 
0,0: (0,0,0) #000000 black 
1,0: (0,0,0) #000000 black 
2,0: (0,0,0) #000000 black 
3,0: (0,0,0) #000000 black 
4,0: (0,0,0) #000000 black 
5,0: (0,0,0) #000000 black 
6,0: (0,0,0) #000000 black 
7,0: (0,0,0) #000000 black 
8,0: (0,0,0) #000000 black 
... 
... 
99,138: (65535,0,0) #FF0000 red 
100,138: (65535,0,0) #FF0000 red 
101,138: (65535,0,0) #FF0000 red 
102,138: (65535,0,0) #FF0000 red 
103,138: (65535,0,0) #FF0000 red 

如果我们再次做同样的事情,但这次解析输出寻找#FF0000(在Windows上,你会用FINDSTR,而不是awk),只是打印第一场到冒号:

magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: | awk -F: '/#FF0000/{print $1}' 


99,138 
100,138 
101,138 
102,138 
103,138 
434,138 
439,138 
440,138 
... 
... 

当你正在使用MATLAB,您将需要掏出来ImageMagick的是这样的:

[result,output]=system("magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: | awk -F: '/#FF0000/{print $1}'"); 

您可能需要在Windows中插入符号(^)逃离%迹象。或者你可以把所有的命令放在一个BATCH文件中,如果你经常这样做,就打电话保存输入。

+0

我喜欢这一点。我可以任意地将这些命令放到f90中,以使exe能够完成这项工作。 Matlab,我不知道如何使用Fortran来操作它。谢谢! –

+0

你可以这样做,但@ m7913d的解决方案更优雅。我为他投票! –