эквивалентный по записи - PullRequest
3 голосов
/ 02 февраля 2011

В MATLAB Toolbox Tool для обработки изображений есть функция improfile, которая возвращает профиль интенсивности изображения из-под линии, определяемой двумя точками.

Isсуществует запись эквивалента этой функции?То есть я хотел бы передать две точки (чтобы указать линию) и вектор значений пикселей, чтобы заменить группу пикселей ниже линии.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

Я знаю ужасный способ сделать это. Вот как:

Используйте imline для создания ROI, состоящей из вашей линии. (Сначала используйте imshow.)

imshow(I,[])
H = imline(gca,[x1 y1; x2 y2]);

Создание двоичного ROI из встроенного

BW = createMask(H);

Найти координаты ROI

p = find(BW==1);

Вставьте свой вектор в изображение I вдоль линии, указанной в ROI

I(p) = v;

Чтобы это работало, длина вектора v и длина области интереса должны быть одинаковыми. Это не всегда легко. Чтобы исправить это, интерполируйте ваш v-вектор, чтобы получить правильный размер, то есть замените последнюю строку этой

I(p) = interpft(v,length(p));
1 голос
/ 02 февраля 2011

Вы проверяли исходный код для improfile? Для получения индексов точек профиля используется interp1, за которым следует round.

Более простой (и, вероятно, не такой удачной) альтернативой является использование простого параметрического уравнения для линии и получение отдельных точек вдоль отрезка:

imageData =zeros(50,50);
endPoints =[ 2 3; 40 27];

numberOfInterpolationPoints = 50;
t=linspace(0,1,numberOfInterpolationPoints);

% x and y of the points along this line
x = 2 + t*( 40-2);
y = 3 + t*(27-3);

% Round them to obtain valid indices
profPoints = [x;y]';
profPoints = round(profPoints);

% Keep only unique numbers
profPoints = unique(profPoints,'rows');

% Convert to liner indices
profPointsInd = sub2ind(size(imageData),profPoints(:,1), profPoints(:,2));

imageData(profPointsInd) = 1;

imagesc(imageData);
0 голосов
/ 10 мая 2011

Я сделал в основном то, что предложил Ghaul , но заменил imline() на ручной поиск нижележащих пикселей.Преимущество состоит в том, что не показана цифра, которая дает некоторые преимущества в скорости (~ 0,5 с в моих тестах);

dist_euc = norm(p1 - p2);
n_pix = round(dist_euc*2);
step = (p1 - p2)/n_pix;
pix_coords = zeros(n_pix, 2);
for cp = 0:n_pix
    pix_coords(cp+1, :) = round(p2 + cp*step);
end
pix_inds = sub2ind(size(im), pix_coords(:,2), pix_coords(:,1));
pix_inds = unique(pix_inds);
im(pix_inds) = interpft(prof, length(pix_inds));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...