Octave中的对数曲线下面积,来自线图像的坐标点阵列

时间:2016-10-03 18:42:00

标签: matlab image-processing octave

我在白色背景上有弯曲的黑色线条的图像文件。所有的线都不同,但这是一个例子。实际图像受版权保护;我无法上传它。我在MS Paint中追踪了这条线。

red line

我的最终目标是使用trapz计算这些曲线下的面积,但首先我必须将y坐标转换为它们的10次幂,因为它们是对数刻度。我看到第一步是获得一个代表线条的坐标数组。

这是我第一次使用Octave。我使用imread上传我的图片。它显示了一个255s和0s的矩阵,对应于我的图像。我试过了

[yy xx] = find(img);

我在另一个问题(Calculate area under FFT graph in MATLAB)上看到了,但是当我进入

figure;plot(xx,yy,'.');

我得到了两个直方图条形图像。

对于我的第二次尝试,我在

尝试了最佳答案

How do I calculate the area under a curve in an image with MATLAB?

然而,第一行

[img,map] = imread('file.png')

将img作为178x373x3的uint8返回并映射为0x0的double。

或者,如果有更聪明的方法来解决我在R或Python中的问题,请指出我的方向。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在你的问题中,你说你有一条黑线,你上传了一条红线,但我们走了:

您的输入red_line.png:

input image

## load image
img = im2double (imread ('red_line.png'));

## use only green inverted channel
tmp = 1 - img(:,:,2);

## get the weighted centroid in y direction
## in GNU Octave
#y = sum (tmp .* (1:rows (tmp))') ./ sum (tmp);

## in GNU Octave and Matlab
y = sum (bsxfun (@times, tmp , (1:rows (tmp))')) ./ sum (tmp);


plot (y, 'linewidth', 2)
set (gca, 'ydir', 'reverse')
grid on

print out.png

plot after extraction

注意:此示例使用自动广播。在Matlab中你必须用bsxfun替换它或者等待它们适应它的R2017。