【问题标题】:Trace a line in an image MATLAB跟踪图像中的一条线 MATLAB
【发布时间】:2015-06-20 23:14:05
【问题描述】:

我正在编写一个程序来计算示波器输出的一些东西,但由于程序现在可以运行,我只需将图像导入 MATLAB,然后使用 ginput 来查找生成曲线上各个区域的坐标。

有什么方法可以让我拍下这张图片:

并让 ginput 或类似的东西自动沿着亮绿色曲线跟踪并将 x,y 坐标存储到单独的数组中(也许通过能够区分曲线的颜色和背景颜色)?这样我就可以使用图片中曲线的 x,y 坐标的实际绘图,而不需要在数据分析中实际使用图像。

我能得到的最接近的方法是使用[x,y]=ginput 沿着曲线混合鼠标按钮并生成一个巨大的数组,但我的手指需要休息!

谢谢!

【问题讨论】:

  • 一个小问题,但很重要:生成曲线的x,y坐标是否需要与示波器的坐标系相关?
  • 不是真的,只是曲线点所在像素的 x,y 坐标。看起来下面的建议可能正是我正在寻找的 - 一旦我设法使用计算机,就会更新你们。
  • 听起来不错!只是好奇。

标签: image matlab image-processing computer-vision


【解决方案1】:

看看这个

img = imread('http://i.stack.imgur.com/3GH1x.jpg'); %// read the image
bw = img(:,:,2) > 128; %// pick only green points (2nd RGB channel)
bw(275:end,:) = false; %// discard the lower flat line
[yy xx]=find(bw); %// get the x-y coordinates of green pixels

现在你可以绘制点了:

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

结果是

如果您对线很粗(即每个 x 有多个 y 值)感到困扰,您可以简单地取平均值

uy = accumarray( xx, yy, [], @mean );
ux = 1:max(xx);

可视化线条

figure;imshow( img );hold on; plot(ux,uy,'r','LineWidth',1.5);


如果你也是在网格之后,那么

[gy gx] = find( max(img,[],3) < 60); %// get the darkest points

为了确定我们寻找x的网格点,使得许多网格点gy具有相同的gx

nx = hist(gx,1:size(img,2));  %// count how many gx per x location
gxx = find(nx > 100 ); %// only those with more than 100 are grid X

y 也一样:

ny = hist(gy,1:334); 
gyy = find(ny > 100 );

删除重复项:

gxx( diff([0 gxx]) == 1 ) = [];
gyy( diff([0 gyy]) == 1 ) = [];

创建网格点

[GX GY] = meshgrid(gxx, gyy);

现在全图:

figure('Name','I MUST award Shai a FAT Bounty for this');
imshow( img );hold on;
plot(ux,uy,'r','LineWidth',1.5); %// the curve
scatter( GX(:), GY(:), 150, '+c'); %// the grid

【讨论】:

  • 嘿!没有什么比一些简单的阈值来完成这项工作更重要了。 +1。
  • 好的,现在我看到了accumarray。很棒。
  • 是否也包含网格是一个类似的过程?
  • @Shai - 如果可以的话,我会给你+10...你的title 很有趣。
  • @rayryeng 这是极简主义的杰作:将多年的学习和数小时的编程浓缩成一个音节!
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2011-01-28
  • 2023-03-07
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2011-06-01
相关资源
最近更新 更多