【问题标题】:How do I create an image matrix with a line drawn in it in MATLAB?如何在 MATLAB 中创建带有线条的图像矩阵?
【发布时间】:2009-12-21 15:44:30
【问题描述】:

我想绘制一条从一个明确定义的点到另一个点的线,然后将其转换为图像矩阵,以在其上使用高斯滤波器进行平滑处理。为此,我使用函数linegetframe 绘制一条线并捕获图像中的图形窗口,但getframe 非常慢且不太可靠。我注意到当计算机被锁定时它不会捕获任何内容,并且在执行 170 次后我收到了 out of memory 错误。

我的问题是:

  • 我可以使用 getframe 的替代品吗?
  • 有没有办法创建图像矩阵并直接在其中画线?

这是一个最小的代码示例:

figure1=line([30 35] ,[200 60]);
F= getframe;
hsize=40; sigma=20;
h = fspecial('gaussian',hsize,sigma); 
filteredImg = imfilter(double(F.cdata), h,256);
imshow(uint8(filteredImg));

[更新]

High-Performance Mark 的linspace 的想法看起来很有前途,但是如何访问使用linspace 计算的矩阵坐标呢?我尝试了以下代码,但它没有按我认为的那样工作。我认为这是一个非常简单和基本的 MATLAB 东西,但我无法理解它:

matrix=zeros(200,60);
diagonal=round([linspace(30,200,numSteps); linspace(35,60,numSteps)]);
matrix(diagonal(1,:), diagonal(2,:))=1;
imshow(matrix);

【问题讨论】:

  • 所以,你正在做的是矢量图像的光栅化。关于这个主题有很多很好的参考资料,维基百科一如既往地是一个很好的起点。
  • 我知道,但我总是尝试使用 Matlab 自带的函数。我学的不多,但它们更快,而且我不必像我自己的代码那样花时间调试它们。

标签: matlab image-processing matrix plot line


【解决方案1】:

这是一个将直线直接绘制到矩阵中的示例。首先,我们将为空图像创建一个零矩阵:

mat = zeros(250, 250, 'uint8');  % A 250-by-250 matrix of type uint8

然后,假设我们要画一条从(30, 35)(200, 60) 的线。我们将首先计算线的长度必须是多少像素:

x = [30 200];  % x coordinates (running along matrix columns)
y = [35 60];   % y coordinates (running along matrix rows)
nPoints = max(abs(diff(x)), abs(diff(y)))+1;  % Number of points in line

接下来,我们使用linspace计算行像素的行和列索引,使用sub2ind将它们从下标索引转换为线性索引,然后使用它们修改mat

rIndex = round(linspace(y(1), y(2), nPoints));  % Row indices
cIndex = round(linspace(x(1), x(2), nPoints));  % Column indices
index = sub2ind(size(mat), rIndex, cIndex);     % Linear indices
mat(index) = 255;  % Set the line pixels to the max value of 255 for uint8 types

然后您可以使用以下内容可视化该行和过滤后的版本:

subplot(1, 2, 1);
image(mat);        % Show original line image
colormap(gray);    % Change colormap
title('Line');

subplot(1, 2, 2);
h = fspecial('gaussian', 20, 10);  % Create filter
filteredImg = imfilter(mat, h);    % Filter image
image(filteredImg);                % Show filtered line image
title('Filtered line');

【讨论】:

  • 感谢 gnovice 的全面解答!
【解决方案2】:

如果您有计算机视觉系统工具箱,则可以使用 ShapeInserter 对象。这可用于在图像上绘制线、圆、矩形和多边形。

mat = zeros(250,250,'uint8');
shapeInserter = vision.ShapeInserter('Shape', 'Lines', 'BorderColor', 'White');
y = step(shapeInserter, mat, int32([30 60 180 210]));
imshow(y);

http://www.mathworks.com/help/vision/ref/vision.shapeinserterclass.html

【讨论】:

    【解决方案3】:

    您可以查看我的答案here。这是实现您所要求的强大方法。我的方法的优点是它不需要额外的参数来控制所绘制线条的密度

    【讨论】:

      【解决方案4】:

      类似这样的:

      [linspace(30,200,numSteps); linspace(35,60,numSteps)]

      这对你有用吗?

      标记

      【讨论】:

      • Linspace 看起来很有前途,但是如何访问使用 linspace 计算的矩阵坐标呢?我尝试了最后 30 分钟,但以下代码不起作用,因为我认为它应该.. (scnr) 我认为,这是一个非常简单和基本的 Matlab 东西,但我就是无法理解它。矩阵=零(200,60);对角线=圆形([linspace(30,200,numSteps); linspace(35,60,numSteps)]);矩阵(对角线(1,:),对角线(2,:))=1; imshow(矩阵);
      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多