Реализация преобразования Радона в Matlab, выходной размер
В связи с характером моей проблемы, я хочу оценить численные реализации преобразования Радона в Matlab (то есть разные методы интерполяции дают разные числовые значения).
пытаясь закодировать свой собственный радон и сравнить его с выходом Matlab, я обнаружил, что мои размеры проекции радона отличаются от размеров Matlab.
Так что немного интуиции о том, как я вычисляю количество, если нужны образцы радона. Давайте сделаем 2D-случай.
Идея заключается в том, что максимальный размер будет при проекции диагональной (по крайней мере, в прямоугольной форме) части в преобразовании радона, поэтому diago=sqrt(size(I,1),size(I,2))
, Поскольку мы ничего не теряем, n_r=ceil(diago)
, n_r
должно быть количество дискретных выборок преобразования радона должно быть, чтобы гарантировать, что никакие данные не пропущены.
Я заметил, что Матлаб radon
вывод всегда четный, что имеет смысл, так как вы хотите, чтобы "луч" проходил через центр вращения всегда. И я заметил, что во всех случаях в конечных точках массива есть 2 нуля.
Так что в этом случае, n_r=ceil(diago)+mod(ceil(diago)+1,2)+2;
Тем не менее, кажется, что я получаю небольшие расхождения с Matlab.
MWE:
% Try: 255,256
pixels=256;
I=phantom('Modified Shepp-Logan',pixels);
rd=radon(I,pi/4);
size(rd,1)
s=size(I);
diagsize=sqrt(sum(s.^2));
n_r=ceil(diagsize)+mod(ceil(diagsize)+1,2)+2
rd=
367
n_r =
365
Поскольку преобразование Радона в Matlab - это функция, на которую я не могу смотреть, мне интересно, почему это может быть таким расхождением.
2 ответа
Я еще раз взглянул на проблему и считаю, что это действительно правильный ответ. Из "скрытой документации" radon.m (введите edit radon.m
и прокрутите вниз)
Выработанный синтаксис
R = RADON(I,THETA,N) возвращает преобразование Радона с проекцией, вычисленной в N точках. R имеет N строк. Если вы не укажете N, то количество точек, по которым вычисляется проекция:
2*ceil(norm(size(I)-floor((size(I)-1)/2)-1))+3
Этого числа достаточно для вычисления проекции с единичными интервалами, даже по диагонали.
Я не пытался пересмотреть эту формулу, но думаю, это то, что вы ищете.
Это довольно специализированный вопрос, поэтому я предложу идею, не будучи полностью уверенным, что это ответ на ваш конкретный вопрос (обычно я пропускаю и позволяю кому-то ответить, но я не уверен, сколько читателей в stackru имеют изучал radon
). Я думаю, что вы могли бы пропустить это floor
функция в документации для radon
вызов функции. Из документа:
Радиальные координаты, возвращаемые в xp, представляют собой значения вдоль оси x, которая ориентирована под тета-градусами против часовой стрелки от оси x. Начало обеих осей - центральный пиксель изображения, который определяется как
floor((size(I)+1)/2)
Например, в изображении 20 на 30 центральный пиксель равен (10,15).
Это дает другое поведение для задач нечетного или четного размера, которые вы передаете. Следовательно, в вашем примере ("Попробуйте: 255, 256") вам потребуется другой случай для нечетного и четного, и это может включать (в действительности) заполнение строк и столбцов нулей.