在图像 MATLAB 中追踪一条线
Trace a line in an image MATLAB
我正在编写一个程序来计算一些带有示波器输出的东西,但由于程序现在可以运行,我只是将图像导入 MATLAB,然后使用 ginput 来查找生成曲线上各个区域的坐标。
有什么方法可以让我拍摄这张图片:
并让 ginput 或类似的东西自动沿着明亮的绿色曲线追踪并将 x、y 坐标存储到单独的数组(可能通过能够区分曲线的颜色和背景颜色)?这样我就可以使用图片中曲线的实际 x、y 坐标图,而不需要在数据分析中实际使用图像。
我能得到的最接近的只是使用 [x,y]=ginput
沿着曲线捣碎鼠标按钮并生成一个巨大的阵列,但我的手指需要休息!
谢谢!
看看这个
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
我正在编写一个程序来计算一些带有示波器输出的东西,但由于程序现在可以运行,我只是将图像导入 MATLAB,然后使用 ginput 来查找生成曲线上各个区域的坐标。
有什么方法可以让我拍摄这张图片:
并让 ginput 或类似的东西自动沿着明亮的绿色曲线追踪并将 x、y 坐标存储到单独的数组(可能通过能够区分曲线的颜色和背景颜色)?这样我就可以使用图片中曲线的实际 x、y 坐标图,而不需要在数据分析中实际使用图像。
我能得到的最接近的只是使用 [x,y]=ginput
沿着曲线捣碎鼠标按钮并生成一个巨大的阵列,但我的手指需要休息!
谢谢!
看看这个
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