使用 Matlab 从 png 中的绘图中提取数据
Extracting Data from a Plot in a png using Matlab
我想使用 Matlab 从绘图中提取曲线。我想 select 我想提取的曲线的颜色,然后输出它们的坐标。我意识到为相对图完成此操作很复杂,所以我需要的只是像素位置。从那里我可以分析它们对应的是什么。提供了一个示例图像,我想在其中获取红色曲线,并将它们的位置输出到文本文件。
一个非常好的补充是 'curve fit' 提取的像素。提取的图形值很可能来自 +5 像素宽度曲线,您的数字数据将具有宽度。最好对这种行为进行平均并精简数据。
红色是曲线上的像素,蓝色是要提取的有效像素。我看到这是通过两种方式完成的:对图像进行转换,然后提取值,反之亦然。我不确定哪个更好。
由于似乎没有人提供 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 }'
99,138
100,138
101,138
102,138
103,138
434,138
439,138
440,138
...
...
当你使用 Matlab 时,你需要 shell 输出到 ImageMagick 像这样的东西:
[result,output]=system("magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: | awk -F: '/#FF0000/{print }'");
您可能需要 Windows 上的插入符号 (^
) 来转义 %
符号。或者,您可以将所有命令放在 BATCH 文件中,如果您经常这样做,只需调用它来节省输入。
与 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
我想使用 Matlab 从绘图中提取曲线。我想 select 我想提取的曲线的颜色,然后输出它们的坐标。我意识到为相对图完成此操作很复杂,所以我需要的只是像素位置。从那里我可以分析它们对应的是什么。提供了一个示例图像,我想在其中获取红色曲线,并将它们的位置输出到文本文件。
一个非常好的补充是 'curve fit' 提取的像素。提取的图形值很可能来自 +5 像素宽度曲线,您的数字数据将具有宽度。最好对这种行为进行平均并精简数据。
红色是曲线上的像素,蓝色是要提取的有效像素。我看到这是通过两种方式完成的:对图像进行转换,然后提取值,反之亦然。我不确定哪个更好。
由于似乎没有人提供 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 }'
99,138
100,138
101,138
102,138
103,138
434,138
439,138
440,138
...
...
当你使用 Matlab 时,你需要 shell 输出到 ImageMagick 像这样的东西:
[result,output]=system("magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: | awk -F: '/#FF0000/{print }'");
您可能需要 Windows 上的插入符号 (^
) 来转义 %
符号。或者,您可以将所有命令放在 BATCH 文件中,如果您经常这样做,只需调用它来节省输入。
与 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