В Matlab, как сканировать двоичное изображение в 2D-системе координат, которое повернуто на 45 градусов к фактической системе координат?

У меня есть бинарное изображение, как на рисунке ниже,

введите здесь описание изображения

система координат x-y является системой координат по умолчанию, которая поставляется с MATLAB. Я могу получить сумму пикселей в каждой строке и столбце в системе координат xy.

Но мне нужна сумма пикселей, перейдя через систему координат u-v. Как я могу это получить?

Моя идея состоит в том, чтобы

1) Преобразовать систему координат x-y в непрерывную (действительную) систему координат. 2) Найти точки в координатах x-y, соответствующие каждой точке в системе координат u-v. подобно (1,1) в u-v соответствует (1.26,1.45) в x-y. 3) Получите сумму строк и столбцов в координате u-v.

В связи с этим 1) каковы методы создания пространственной системы координат и преобразования пиксельной системы координат в пространственную систему координат? 2) как получить значения дробных пикселей в пространственной системе координат?

Спасибо.


person Sulla    schedule 04.01.2012    source источник


Ответы (3)


Если вам действительно нужны только диагонали точно под 45 градусов, а ваши пиксели квадратные (безопасное предположение для большинства стандартных камер), то вам действительно не нужно выполнять какое-либо преобразование координат, я не думаю. Вы можете использовать тот факт, что все точки по диагоналям имеют форму, например. I(ix, ix), I(1 + ix, ix). Работа с ограничениями немного сложна. Попробуйте это для сумм «столбца» (диагональ от верхнего левого угла до нижнего правого), начиная с левого нижнего угла, двигаясь вверх по левому краю, а затем поверху:

I = eye(5, 4);
I(4, 1) = 1;

[nrows, ncols] = size(I);
colsums = zeros(nrows + ncols - 1, 1);

% first loop over each row in the original image except the first one
for ix = nrows : -1 : 2,
    JX = [0 : min(nrows - ix, min(nrows-1, ncols-1))];
    for jx = JX,
        colsums(nrows - ix + 1) = colsums(nrows - ix + 1) + I(ix + jx, jx + 1);
    end
end

% then loop over each column in the original image 
for ix = 1 : ncols,
    JX = [0 : min(nrows - ix - 1, min(nrows-1, ncols-1))];
    for jx = JX,
        colsums(nrows + ix - 1) = colsums(nrows + ix - 1) + I(1 + jx, ix + jx);
    end
end

Обратите внимание: если для вас важно расстояние (похоже, что это не так), то расстояния по этим диагоналям в sqrt(2)/2 больше.

person dantswain    schedule 04.01.2012
comment
Большое спасибо. Я думаю, что это именно то, что делает функция радона. Это помогло мне понять то, чего я не понимал в функции радона. - person Sulla; 05.01.2012

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

http://en.wikipedia.org/wiki/Radon_transform

I = checkerboard(10,10);
figure;imshow(I)
R = radon(I,[45 135]);
figure;plot(R(:,1))

Вот несколько изображений, объясняющих преобразование Радона.

Изображение взято из Википедии

Изображение взято из справки Matlab

person Andrey Rubshtein    schedule 05.01.2012
comment
Спасибо. Я понял, что предыдущий ответ был реализацией радона. Но я возился с единицами. Длина 1/sqrt(2) и сама реализация дали мне ясное представление. - person Sulla; 05.01.2012

Я бы использовал meshgrid для создания системы координат для изображения. Вы можете вращать эту систему координат путем умножения матриц на матрицу вращения. Это должно дать вам преобразованные координаты, но вам нужны их значения, и, как вы сказали, они будут дробными пикселями. Вам решать, как лучше интерполировать. Один из способов — просто использовать значение ближайшего пикселя (так называемого ближайшего соседа). Линейная интерполяция обычно дает лучший результат — возьмите соседние пиксели и суммируйте их, взвешивая по тому, насколько они близки к вашей целевой координате. Я бы возился с методами интерполяции более высокого порядка, только если результаты неудовлетворительны.


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

person aganders3    schedule 04.01.2012
comment
проблема с методом imrotate заключается в том, что он вводит пустые пиксели в результате вращения. Интегральная сумма строк дает вводящую в заблуждение информацию из-за этих пустых пикселей, введенных по краям. - person Sulla; 05.01.2012
comment
Но пустые пиксели не повлияют на суммирование, так как все они равны нулю. - person aganders3; 05.01.2012
comment
Повлияет на мой расчет, так как меня интересуют строка и столбец с минимальным значением пикселя. Поскольку imrotate ввел пустые строки и столбец, которые стали бы моей минимальной строкой/столбцом. - person Sulla; 05.01.2012