【问题标题】:Extracting Data from a Plot in a png using Matlab使用 Matlab 从 png 中的绘图中提取数据
【发布时间】:2017-04-07 21:19:29
【问题描述】:

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

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

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

【问题讨论】:

  • 您知道它们会按扫描线顺序出现吗?我的意思是图像第一行中的所有红色像素,然后是第二行中的所有红色像素,依此类推。
  • @MarkSetchell 好吧,在 MATLAB 中按列顺序排列。摩根船长,看起来这张图与Img(:,:,1) & ~Img(:,:,2) 配合得很好。您的所有图表都会如此漂亮和整洁吗?
  • 这在 Matlab 中是可行的,但如果这是一项一次性任务,我建议使用网络应用程序“WebPlotDigitizer”,您可以在其中以高精度手动完成。如果您使用 Matlab 制作,相交的红线会让您的生活变得更加复杂。
  • @Mark 没关系。我不关心顺序,我只需要单一颜色的所有实例的位置。 @beaker 是的,大多数都会这么整洁。也许还有两两种其他颜色,但大多数都是“简单”的。

标签: matlab image-processing extraction


【解决方案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

【讨论】:

  • 下一步扩展此功能是将这些具有“宽度”的曲线转换为离散数据。拥有所需颜色的每个像素是很棒的,因为一个简单的转换就可以使它适合图形值,但是能够对数据进行曲线拟合将是惊人的。
  • 您可以先自己尝试一下,遇到问题再提出新问题。
【解决方案2】:

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

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

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

如果我们再做同样的事情,然后像这样将图像转换为文本:

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 文件中,如果您经常这样做,只需调用它即可节省输入。

【讨论】:

  • 我喜欢这个。我可以将这些命令任意放入 f90 以让 exe 完成这项工作。 Matlab,我不确定如何使用 fortran 进行操作。谢谢!
  • 你可以这样做,但@m7913d 的解决方案要优雅得多。我投他的票!
猜你喜欢
  • 1970-01-01
  • 2013-01-09
  • 2012-05-08
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多