Получение всех пиксельных координат вектора внутри изображения - PullRequest
4 голосов
/ 15 сентября 2009

У меня есть изображение интенсивности / оттенков серого, и я выбрал пиксель внутри этого изображения. Я хочу отправить векторы, начиная с этого пикселя, во всех направлениях / углах, и я хочу суммировать все интенсивности пикселей, соприкасающихся с одним вектором, для всех векторов.

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

Ранее я делал это на C ++, что требовало много кода. Я уверен, что это можно сделать с меньшими усилиями в MATLAB, но я новичок в MATLAB, поэтому любая помощь будет принята с благодарностью, так как я не нашел ничего полезного в документации.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2009

Возможно, это не лучший способ ее решить, но вы можете сделать это, используя немного алгебры, вот как ...
Мы знаем, что формула точки-наклона линии, проходящей через точку (a, b) с углом тета, равна:

y = tan(theta) * (x-a) + b

Поэтому простая идея состоит в том, чтобы вычислить пересечение этой линии с y = const для всех const и прочитать значения интенсивности на пересечении. Вы бы повторили это для всех углов ...
Пример кода для иллюстрации концепции:

%% input
point = [128 128];               % pixel location
I = imread('cameraman.tif');     % sample grayscale image

%% calculations
[r c] = size(I);
angles = linspace(0, 2*pi, 4) + rand;
angles(end) = [];
clr = lines( length(angles) );   % get some colors

figure(1), imshow(I), hold on
figure(2), hold on

for i=1:length(angles)
    % line equation
    f = @(x) tan(angles(i))*(x-point(1)) + point(2);

    % get intensities along line
    x = 1:c;
    y = round(f(x));
    idx = ( y<1 | y>r );        % indices of outside intersections
    vals = diag(I(x(~idx), y(~idx)));

    figure(1), plot(x, y, 'Color', clr(i,:))    % plot line
    figure(2), plot(vals, 'Color', clr(i,:))    % plot profile
end
hold off
3 голосов
/ 16 сентября 2009

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

Предположим, что у вас есть матрицы регулярно расположенных x и y координат, которые имеют тот же размер, что и ваше изображение, так что координаты пикселя (i,j) задаются как (x(i,j),y(i,j)). В качестве примера я создам примерный набор целочисленных координат 5 на 5, используя MESHGRID :

>> [xGrid,yGrid] = meshgrid(1:5)

xGrid =

     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5

yGrid =

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3
     4     4     4     4     4
     5     5     5     5     5

Далее мы можем определить линию y = m*(x - a) + b, проходящую через систему координат, выбрав некоторые значения для констант и вычислив y с использованием координат x сетки:

>> a = 0;
>> b = 1;
>> m = rand

m =

    0.5469

>> y = m.*(xGrid(1,:)-a)+b

y =

    1.5469    2.0938    2.6406    3.1875    3.7344

Наконец, мы находим точки y в сетке, которые отличаются от точек, вычисленных выше, меньше размера сетки:

>> index = abs(yGrid-repmat(y,size(yGrid,1),1)) <= yGrid(2,1)-yGrid(1,1)

index =

     1     0     0     0     0
     1     1     1     0     0
     0     1     1     1     1
     0     0     0     1     1
     0     0     0     0     0

и используйте эту индексную матрицу, чтобы получить координаты x и y для пикселей, пересекаемых линией:

>> xCrossed = xGrid(index);
>> yCrossed = yGrid(index);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...