Рисование круга на массиве для целей интеграции CCD - PullRequest
0 голосов
/ 26 января 2012

Я пишу функцию для рисования приблизительного круга на квадратном массиве (в Matlab, но проблема в основном алгоритмическая).
Цель состоит в том, чтобы создать маску для интеграции света, который падает на часть датчика CCD от точечного источника с ограниченной дифракцией (диаметр которого соответствует нескольким пикселям на матрице CCD). Таким образом, датчик CCD видит шаблон с симметрией вращения, который, разумеется, не обязан центрироваться на одном конкретном пикселе CCD (см. Пример изображения ниже).

Вот алгоритм, который я сейчас использую для создания моей дискретной круговой маски и который работает частично (код Matlab / Octave):

xt = linspace(-xmax, xmax, npixels_cam); % in physical coordinates (meters)
[X Y] = meshgrid(xt-center(1), xt-center(2)); % shifted coordinate matrices
[Theta R] = cart2pol(X,Y);
R = R'; % cart2pol uses a different convention for lines/columns
mask = (R<=radius);

Как видите, мой алгоритм выбирает (устанавливает в 1) все пиксели, физическое расстояние которых (в метрах) меньше или равно радиусу, который не обязательно должен быть целым числом.

Мне кажется, что мой алгоритм не может быть лучшим решением этой проблемы. В частности, я хотел бы, чтобы он включал пиксель, в котором присутствует центр, даже если радиус очень мал.
Есть идеи?

(См. http://i.stack.imgur.com/3mZ5X.png для примера изображения пятна, ограниченного дифракцией, на ПЗС-камере).

Ответы [ 2 ]

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

Это хорошо изученная проблема.Возможны несколько уровней оптимизации:

  • Вы можете проверить грубую силу, находится ли каждый пиксель внутри круга.(r^2 >= (x-x0)^2 + (y-y0)^2)

  • Вы можете проверить методом грубой силы, находится ли каждый пиксель в квадрате, ограничивающем окружность, внутри окружности.(r^2 >= (x-x0)^2 + (y-y0)^2, где |x-x0| < r и |y-y0| < r)

  • Вы можете переходить построчно (где |y-y0| < r) и вычислять начальный x, конечный x и заполнить вселинии между ними.(Хотя квадратные корни недешевы.)

  • Существует бесконечная возможность более сложных алгоритмов.Вот типичный пример: http://en.wikipedia.org/wiki/Midpoint_circle_algorithm (заполнение круга оставлено в качестве упражнения)

Это действительно зависит от того, насколько изощренным вы хотите быть основанным на том, насколько необходимы хорошие показателиесть.

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

, если вы хотите выбрать пиксели, если и только если они содержат какую-либо часть круга C:

в каждом пикселе поместите маленький кружок A с радиусом = размер в два раза меньше пикселя, а еще один вокруг него с R = sqrt (2) * половинный размер круга (описанный круг)

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

Если тестовая окружность C находится в пределах A, то вы выбираете пиксель. Если он находится в пределах B, но не C, вам нужно проверить все стороны четырех пикселей на совпадение, как этот Алгоритм обнаружения столкновений отрезков круговой линии?

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

...