14

如果知道开始和结束坐标,在 MATLAB 中在黑白(二进制)图像上画线的最佳方法是什么?

请注意,我不是要添加注释行。我希望这条线成为图像的一部分。

4

5 回答 5

9

您可能想查看我对关于向图像矩阵添加线的 SO 问题的回答。这是与我在该答案中的示例类似的示例,它将使白线从行和列索引(10, 10)延伸到(240, 120)

img = imread('cameraman.tif');  % Load a sample black and white image
x = [10 240];                   % x coordinates
y = [10 120];                   % y coordinates
nPoints = max(abs(diff(x)), abs(diff(y)))+1;    % Number of points in line
rIndex = round(linspace(y(1), y(2), nPoints));  % Row indices
cIndex = round(linspace(x(1), x(2), nPoints));  % Column indices
index = sub2ind(size(img), rIndex, cIndex);     % Linear indices
img(index) = 255;  % Set the line points to white
imshow(img);       % Display the image

这是生成的图像:

在此处输入图像描述

于 2010-03-17T18:51:31.863 回答
5

如果您对其他方法的特殊情况感到困扰,这里有一个防弹方法,它会导致一行:

  • 其像素在整个行的长度内始终相互接触(像素彼此为 8 个相邻像素),
  • 线的密度不依赖于附加参数,而是灵活地确定以适应从第一点开始的保证。

输入(便于使用此代码实现功能):

  • img- 包含图像的矩阵,
  • x1, y1, x2, y2- 要绘制的线的端点坐标。

代码:

% distances according to both axes
xn = abs(x2-x1);
yn = abs(y2-y1);

% interpolate against axis with greater distance between points;
% this guarantees statement in the under the first point!
if (xn > yn)
    xc = x1 : sign(x2-x1) : x2;
    yc = round( interp1([x1 x2], [y1 y2], xc, 'linear') );
else
    yc = y1 : sign(y2-y1) : y2;
    xc = round( interp1([y1 y2], [x1 x2], yc, 'linear') );
end

% 2-D indexes of line are saved in (xc, yc), and
% 1-D indexes are calculated here:
ind = sub2ind( size(img), yc, xc );

% draw line on the image (change value of '255' to one that you need)
img(ind) = 255;

这是在其上绘制了三条线的示例图像: 在此处输入图像描述

于 2013-01-13T21:47:03.353 回答
3

该算法提供了一种方法。

于 2010-03-17T18:03:13.927 回答
1

它实际上只是对 plesiv 答案的修改。我在图像上画了数千条线,我需要提高性能。通过省略interp1调用和使用整数变量所做的最大改进使它稍微快了一点。与 plesiv 的代码相比,它在我的 PC 上的执行速度快了 18%。

function img = drawLine(img, x1, y1, x2, y2)
x1=int16(x1); x2=int16(x2); y1=int16(y1); y2=int16(y2);
% distances according to both axes
xn = double(x2-x1);
yn = double(y2-y1);

% interpolate against axis with greater distance between points;
% this guarantees statement in the under the first point!
if (abs(xn) > abs(yn))
    xc = x1 : sign(xn) : x2;
    if yn==0
        yc = y1+zeros(1, abs(xn)+1, 'int16');
    else
    yc = int16(double(y1):abs(yn/xn)*sign(yn):double(y2));
    end
else
    yc = y1 : sign(yn) : y2;
    if xn==0
        xc = x1+zeros(1, abs(yn)+1, 'int16');
    else
    xc = int16(double(x1):abs(xn/yn)*sign(xn):double(x2));
    end
end

% 2-D indexes of line are saved in (xc, yc), and
% 1-D indexes are calculated here:
ind = sub2ind(size(img), yc, xc);

% draw line on the image (change value of '255' to one that you need)
img(ind) = 255;
end
于 2017-05-01T21:01:37.633 回答
0

如果您有计算机视觉系统工具箱,则可以使用insertShape

于 2017-05-01T21:04:46.137 回答