How do I create an image matrix with a line drawn in it in MATLAB?

image-processing, line, matlab, matrix, plot

Solution

Here's one example of drawing a line directly into a matrix. First, we'll create a matrix of zeros for an empty image:

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

Then, let's say we want to draw a line running from `(30, 35)` to `(200, 60)`. We'll first compute how many pixels long the line will have to be:

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

Next, we compute row and column indices for the line pixels using `linspace`, convert them from subscripted indices to linear indices using `sub2ind`, then use them to modify `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

You can then visualize the line and the filtered version with the following:

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');

Problem

I want to plot a line from one well-defined point to another and then turn it into an image matrix to use a Gaussian filter on it for smoothing. For this I use the functions `line` and `getframe` to plot a line and capture the figure window in an image, but `getframe` is very slow and not very reliable. I noticed that it does not capture anything when the computer is locked and I got an `out of memory` error after 170 executions. My questions are: - Is there a substitute to `getframe` that I can use? - Is there a way to create the image matrix and draw the line directly in it? Here is a minimal code sample: ``` 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)); ``` [update] High-Performance Mark's idea with `linspace` looks very promising, but how do I access the matrix coordinates calculated with `linspace`? I tried the following code, but it does not work as I think it should. I assume it is a very simple and basic MATLAB thing, but I just can not wrap my head around it: ``` matrix=zeros(200,60); diagonal=round([linspace(30,200,numSteps); linspace(35,60,numSteps)]); matrix(diagonal(1,:), diagonal(2,:))=1; imshow(matrix); ```

Original source