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

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

enter image description here

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

Но я хочу получить сумму пикселей, пройдя через ультрафиолетовую систему координат.Как я могу получить это?

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

1) Преобразовать систему координат xy в непрерывную (действительную) систему координат 2) Найти точки в координатах xyсоответствует каждой точке в УФ-системе координат.как (1,1) в УФ соответствует (1,26,1,45) в ху.3) Получить сумму строк и столбцов в ультрафиолетовой координате.

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 05 января 2012

Если вы действительно хотите, чтобы диагонали были точно под углом 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 больше.

1 голос
/ 05 января 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))

Вот некоторые изображенияобъяснить преобразование Радона

Image taken from wikipedia

Image taken from Matlab help

0 голосов
/ 05 января 2012

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


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

...