Как создать матрицу изображений с нарисованной линией в MATLAB? - PullRequest
9 голосов
/ 21 декабря 2009

Я хочу построить линию от одной четко определенной точки до другой и затем превратить ее в матрицу изображения, чтобы использовать гауссов фильтр на ней для сглаживания. Для этого я использую функции line и getframe для построения линии и захвата окна рисунка на изображении, но getframe очень медленно и не очень надежно. Я заметил, что он ничего не захватывает, когда компьютер заблокирован, и я получил ошибку out of memory после 170 выполнений.

Мои вопросы:

  • Есть ли замена для 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));

[обновление]

Идея высокопроизводительного Марка с 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);

Ответы [ 4 ]

16 голосов
/ 21 декабря 2009

Вот один пример рисования линии непосредственно в матрице. Сначала мы создадим матрицу нулей для пустого изображения:

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

enter image description here

3 голосов
/ 14 января 2013

Если у вас есть набор инструментов Computer Vision System, доступен объект 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

0 голосов
/ 14 января 2013

Вы можете проверить мой ответ здесь . Это надежный способ достичь того, что вы просите. Преимущество моего подхода в том, что ему не нужны дополнительные параметры для контроля плотности нарисованной линии.

0 голосов
/ 21 декабря 2009

Примерно так:

[LINSPACE (30200, numSteps); LINSPACE (35,60, numSteps)]

Это работает для вас?

Mark

...