我在白色背景上有弯曲的黑色线条的图像文件。所有的线都不同,但这是一个例子。实际图像受版权保护;我无法上传它。我在MS Paint中追踪了这条线。
我的最终目标是使用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中的问题,请指出我的方向。
感谢您的帮助!
答案 0 :(得分:0)
在你的问题中,你说你有一条黑线,你上传了一条红线,但我们走了:
您的输入red_line.png:
## 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
注意:此示例使用自动广播。在Matlab中你必须用bsxfun替换它或者等待它们适应它的R2017。