Как я создаю матрицу изображений с линией, проведенной в нем в MATLAB?

Я хочу построить график от одной четко определенной точки до другого и затем превратить ее в матрицу изображений для использования Гауссова фильтра на нем для сглаживания. Для этого я использую функции 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));

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

Идея высокоэффективного Mark's с 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);
9
задан gnovice 5 May 2017 в 06:39
поделиться

2 ответа

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

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

16
ответ дан 4 December 2019 в 11:42
поделиться

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

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

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

Марк

-1
ответ дан 4 December 2019 в 11:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: