Я хочу построить график от одной четко определенной точки до другого и затем превратить ее в матрицу изображений для использования Гауссова фильтра на нем для сглаживания. Для этого я использую функции 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);
Вот один пример рисования линии непосредственно в матрице. Сначала мы создадим матрицу нулей для пустого изображения:
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');
Примерно так:
[linspace (30 200, numSteps); linspace (35,60, numSteps)]
Это сработает для вас?
Марк