Как рисовать эллипсы в пикселях
Круговые элементы широко используются в области измерений, таких как калибровка камеры, оценка позы, отслеживание цели и т. Д. Перспективная проекция круга, когда плоскость формирования изображения не параллельна круговой плоскости, перспективная проекция круга является эллипсом, а точка перспективной проекции центра круга не совпадает с центральной точкой эллипса. Это отклонение называется отклонением созвездия эллипса. В связи с этим изучение того, как рисовать высокоточный эллипс, имеет большое значение для точности всей измерительной системы.
Функция рисования эллипса в OpenCV
В соответствии с функцией ellipse (), предоставляемой OpenCV, я инкапсулирую ее в функцию рисования эллипса следующим образом:
Используя эту функцию, мы рисуем эллипс с длинной полуосью 100 пикселей, короткой полуосью 80 пикселей и углом отклонения 0 градусов на плоскости, как показано на рисунке 1.1. Вы можете использовать плагин ImageWatch для наблюдения контура края эллипса, как показано на рисунке 1.2.
Как видно из рисунка выше, контур края эллипса, нарисованного с использованием функции рисования эллипса OpenCV, является зигзагообразным, что очень неблагоприятно для точности обнаружения центра эллипса. После тестирования центр рисунка эллипса имеет низкую точность обнаружения.
Метод двух областей для рисования эллипса
Как нарисовать эллипс с любым углом поворота, любой длиной и короткой осью в данной плоскости изображения, и центр эллипса имеет любое значение, и край эллипса относительно мягкий, это неотложная проблема, которую необходимо решить. Без ограничения общности мы берем координаты центра эллипса, нарисованного в размере изображения 600 × 600 пикселей, как (300,67, 300,35), а длины полуосей равны 80 и 60 соответственно. (Единицами являются все пиксели).
2.1 Предварительный чертеж бинаризованного эллипса
Всегда есть общие уравнения для эллипсов
Это уравнение может быть преобразовано в
Стандартное уравнение эллипса
Для наклонного эллипса угол поворота равен -θ (отрицательное значение для удобства последующего обсуждения), тогда:
Введите стандартное уравнение, чтобы получить повернутое уравнение
Упрощенный, чтобы получить
Блок-схема алгоритма может быть обобщена, как показано на рисунке 2.1. После выполнения шагов в блок-схеме сначала создается скриншот контура края двоичного изображения эллипса, как показано на рисунке 2.2.
2.2 Значение метода области
Затем, чтобы сделать контур края эллипса менее четким, используйте метод области, чтобы переназначить краевые пиксели, используя метод области, чтобы сделать контур контура эллипса более гладким. Метод площади относится к делению размера пикселя границы эллипса на n × n точек и переназначению края эллипса в соответствии с формулой (2.13). В формуле Ia - значение пикселя вне эллипса, Ib - значение пикселя внутри эллипса, а I - переназначенное значение пикселя. (Для значения n здесь, если вам интересно, добро пожаловать на обсуждение и обмен на Планете знаний [Visual IMAX]).
Поток алгоритма с использованием метода площади можно грубо суммировать, как показано на рисунке 2.3.
2.3 Используйте метод площади, чтобы точно нарисовать эллипс
В 2.2 мы по умолчанию нашли контур края эллипса, но в реальной работе поиск контура края эллипса все еще является проблемой, которую нам нужно решить. Здесь мы используем алгоритм поиска из восьми окрестностей, а размер ядра фильтра равен 3, как показано на рисунке 2.4.
Используйте это ядро и весь бинаризованный образ эллипса для выполнения операции свертки.После операции свертки бинаризованного эллипса, полученной в разделе 2.1, если это точка вне эллипса, значение пикселя равно 0, в это время мы переназначаем его на 50, если это точка внутри эллипса, значение пикселя равно 8, и в это время мы переназначаем его на 200. Когда значение пикселя находится в диапазоне от 1 до 7, мы можем рассматривать его как контур края эллипса, как показано на рисунке 2.5. Левое изображение на рис. 2.5 - это эллипс, полученный операцией свертки всего изображения эллипса с помощью метода поиска восьми окрестностей, а правое изображение на рис. 2.5 - диаграмма эффекта после увеличения контура края эллипса.
Для контура края эллипса мы можем использовать метод площади, чтобы переназначить контур края эллипса. Таким образом, алгоритм алгоритма для рисования идеального эллипса с использованием метода площади может быть обобщен, как показано на рисунке 2.6. После переназначения контура края эллипса с использованием метода площади идеальный эллипс рисуется, как показано на рисунке 2.7. Левая часть рисунка - это весь эллипс, а правая часть - скриншот контура эллипса.
Очевидно, что край эллипса, нарисованного с использованием метода площади, более мягкий, а точность обнаружения центра эллипса выше.
Три резюме
В статье в основном анализируются два метода рисования эллипса, и сравнение показывает, что метод области рисования эллипса обладает большей точностью.
четыре
Я до сих пор помню время, когда я изучал обнаружение эллипсов. По дороге на работу и с работы каждый день я часто наблюдал необъяснимые огни на обочине дороги, утреннее солнце и вечерний закат. У меня всегда был вопрос: когда они образовались? Точность обнаружения центра изображения эллипса выше?
Все желающие могут попасть на планету знаний [Visual IMAX] и обменяться знаниями вместе.
Рекомендую к прочтению
Ответить Keyword-Knowledge Planet, отсканировать код, чтобы присоединиться к планете
Делаю так :
1) Выделяю элипс.
2) Делаю выделению Бордер - 1 пиксель.
3) Заливаю.
Но тут возникает проблема. Заливка размазывается. И приходится удалять то, что размазалось, а это неудобно.
Поэтому вопрос, как именно БЫСТРО рисовать эллипс ?
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Не совсем понятно, что хочется достичь.
Свойствами контура очень удобно управлять создав Layer Style - Stroke.
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
И чегож тут непонятногото ? Элипс с толщиной обода в пиксель. Как это можно ещё объяснить, чтобы было ещё понятнее ? Уж не знаю.
ArtDesigner
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Позвольте, уважаемый, но про обводку вы ничего не сказали. Эллипс, как и круг - фигура плоская и с заливкой. Отсюда эллипс в 1 пиксель - это эллипс с диаметром в 1 пиксель! А вот окружность - это фигура контурная. И все равно не понятно, как в квадратный пиксель нарисовать круглый эллипс.Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
рисуешь эллиптическим выделением овал себе, потом клик правой кнопкой мыши..
оно?
Вложения
NecroZoider
инопланетный разум
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
2Google Ключевое слово anti-aliased
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
2 ins.
Да, то ! Спасибо, большое !
wienta
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
так и тему надо называть "как создать обводку выделения в один пиксель?", а не "Как БЫСТРО нарисовать эллипс в 1 пиксель?".
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
У меня ещё попутный вопрос. Как сделать края картинки плавно исчезающими на N пикселей ?
То есть я хочу что-то типа того же Stroke, только с плавной опразрачниваемостью.
Есть такое, нет ?
Kot Pafnuty
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Fog_patch
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
И все равно не понятно, как в квадратный пиксель нарисовать круглый эллипс.Пиксель не квадратный и не круглый. Пиксель это описание цвета, и это описание занимает (к примеру) 8 бит на канал. Он вообще не имеет никакой формы и полностью зависит от выводного устройства. Так из под принтера пиксель будет в виде вспрыска краски, на экране в виде точки люминофора, а если поставить 10 000 телевизоров (по 100 на сторону) и вывести картинку 100х100 на них, то пикселем будет целый телевизор.
ArtDesigner
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Сумничал, Туманная заплатка, молодец!
Открой фотошоп, возьми карандаш размером 1 пиксель,
и увидишь - В ФОТОШОПЕ ОН КВАДРАТНЫЙ!
Fog_patch
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Он лишь представлен в виде квадрата (чтоб обыватели не сошли с ума ). Но на самом деле он не имеет отношения к геометрии. Точно так же как «карандаш» ФотоШопа не имеет абсолютно никакого отношения к карандашам :n)
rdes02
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
cache
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
я бы точно сошел с ума если бы увидел эллипсоидный пиксель.__________________________
Суха теория, мой друг, а древо жизни пышно зеленеет.
wienta
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
У меня ещё попутный вопрос. Как сделать края картинки плавно исчезающими на N пикселей ?
То есть я хочу что-то типа того же Stroke, только с плавной опразрачниваемостью.
Есть такое, нет ?
sniffysko
Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
. я бы точно сошел с ума если бы увидел эллипсоидный пиксель. А почему вы смеетесь? Пивсель на вашем экране может быть квадратным если вы сидите за ЖК монитором. А на ЭЛТ он вобще напоминает более круглое пятно, а если быть буквалистом, то триаду пятен (в случае с белым пятном). А ваш мозг, чтобы не корячиться кажый раз, сглаживает те огрехи которые умудряется заметить ваш глаз.Участник
Ответ: Как БЫСТРО нарисовать эллипс в 1 пиксель ?
Этот совет не подходит. Потому, что предполагает, что на слое больше ничего нет, кроме выделения. А если есть ? То тогда замучишься перевыделять по многу раз.
Также как и Тень использовать на слое тоже не подходит, ибо она действует на всё.
И ещё хочу заметить, что очень неудобно рисовать прозрачность. Потому, что края кисти слишком резко опразрачнивают картинку. Или я не нашёл как это регулируется ?
Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.
Содержание статьи
Создание объекта Draw в Python
Используя объекта Image мы создадим фоновое изображение на которой мы будем рисовать наши фигуры при помощи объекта Draw . Не забудьте импортировать модуль Image и ImageDraw в начале кода.
Здесь создается пустое изображение с размером 500 на 300 пикселей и с тёмно желтым фоном.
Рисуем фигуры в Pillow: ellipse, rectangle и line
Вызываем методы рисования из объекта Draw для рисования фигур на нашем желтом фоне.
Рисуем эллипс, прямоугольник и прямую линию в качестве примера.
draw . ellipse ( ( 100 , 100 , 150 , 200 ) , fill = 'red' , outline = ( 0 , 0 , 0 ) ) draw . rectangle ( ( 200 , 100 , 300 , 200 ) , fill = 'blue' , outline = ( 255 , 255 , 255 ) ) draw . line ( ( 350 , 200 , 450 , 100 ) , fill = 'pink' , width = 10 ) im . save ( 'draw-ellipse-rectangle-line.jpg' , quality = 95 )Справочник по параметрам методов рисования
Даже если, способы рисования отличаются в зависимости от используемого метода, следующие параметры являются общими для всех.
Параметр xy указывает прямоугольную область для рисования новой фигуры.
Уточняется один из следующих форматов:
- (((Верхняя левая x координата, Верхняя левая y координата), (нижняя правая x координата, нижняя правая y координата)) ;
- (Верхняя левая x координата, Верхняя левая y координата, нижняя правая x координата, нижняя правая y координата) .
В методах line() , polygon() и point() используются многочисленные координаты вместо двух точек, представляющих прямоугольную область.
- (x1, y1, x2, y2, x3, y3. ) ;
- ((x1, y1), (x2, y2), (x3, y3). ) .
Метод line() рисует прямую линию, которая связывает каждую точку, polygon() рисует многоугольник, а метод point() рисует точку в 1 пиксель для каждой указанной точки.
Параметр fill указывает какой цвет будет использован для заполнения нашей геометрической формы.
Спецификация формата цвета отличается в зависимости от указанного режима изображения (объект Image ):
- RGB : Указывает значение цвета в форме (R, G, B) ;
- L (Черно-белое): Указывает значение (0-255) как целое число).
Значение по умолчанию None (не заполнено).
Есть три способа указать цвет, возьмем красный цвет, его можно записать так:
Параметр outline указывает на цвет границы фигуры.
Спецификация формата цвета такая же, как и у параметра fill которого мы обсуждали выше. Значение по умолчанию равно None (без границ).
Вне зависимости от рисуемой фигуры, вы можете указать размер в пикселях для границы фигуры.
Рисование эллипса и прямоугольника в Python
- Эллипс (Круг): ellipse(xy, fill, outline) ;
- Прямоугольник (Квадрат): rectangle(xy, fill, outline) .
Метод ellipse() рисует эллипс, область рисования указывается в параметр xy . Если мы зададим четыре координата которые будут соответствовать квадрату, то у нас получится ровный круг.
Чтобы нарисовать один прямой отрезок линии, используйте инструмент «Отрезок линии». Обучающую игру с демонстрацией инструмента «Отрезок линии» см. в разделе Использование инструмента «Отрезок линии».
Выберите инструмент «Отрезок линии» .
Выполните одно из следующих действий:
Поместите указатель в ту точку, где должна начинаться линия, и перетащите его в точку ее окончания.
Щелкните в том месте, где должна начинаться линия. В диалоговом окне укажите значения длины и угла линии. Чтобы окрасить линию в текущий цвет заливки, выберите параметр Окрашивать отрезок в цвет заливки . Затем нажмите ОК .
Нажмите и удерживайте инструмент «Отрезок линии» (). Выберите инструмент «Дуга» .
Выполните одно из следующих действий:
Поместите указатель в ту точку, где должна начинаться дуга, и перетащите его в точку ее окончания.
Щелкните в том месте, где должна начинаться дуга. Чтобы определить точку, из которой будет нарисована дуга, щелкните в диалоговом окне квадратик на локаторе неподвижной точки . После этого задайте любые из следующих параметров и нажмите кнопку ОК .
Длина по оси Х. Определяет ширину дуги.
Длина по оси Y. Определяет высоту дуги.
Тип. Определяет, каким контуром будет этот объект: замкнутым или открытым.
Вдоль. Определяет направление дуги. Выберите «Ось X» или «Ось Y» в зависимости от того, вдоль какой оси должна располагаться база дуги: горизонтальной (x) или вертикальной (y).
Наклон: определяет направление наклона дуги. Чтобы получить вогнутую дугу, введите отрицательное значение. Чтобы получить выгнутую дугу, введите положительное значение. При нулевом значении наклона получается прямая линия.
Окрашивать дугу в цвет заливки. Дуга окрашивается в текущий цвет заливки.
Примечание. Для динамического просмотра дуги по мере ввода параметров дважды щелкните инструмент «Дуга» на панели «Инструменты».
Видеоролик с инструкциями по использованию инструментов для рисования фигур см. в разделе Рисование основных фигур.
Нажмите и удерживайте инструмент «Отрезок линии» ( ). Выберите инструмент «Спираль» .
Выполните одно из следующих действий:
Перетащите курсор, пока не получите спираль нужного размера. Чтобы повернуть спираль, перетащите указатель в дуге.
Щелкните в том месте, где должна начинаться спираль. В диалоговом окне задайте любые из следующих параметров и нажмите кнопку ОК .
Радиус. Определяет расстояние от центра до самой дальней точки спирали.
Рост. Определяет величину, на которую каждый виток спирали будет уменьшаться по сравнению с предыдущим витком.
Число сегментов. Определяет количество сегментов в спирали. Каждый полный виток спирали состоит из четырех сегментов.
Стиль. Определяет направление спирали.
Видеоролик с инструкциями по использованию инструментов для рисования фигур см. в разделе Рисование основных фигур.
Инструменты сеток используются для быстрого рисования прямоугольных и полярных сеток. Инструмент «Прямоугольная сетка» создает прямоугольные сетки заданного размера с заданным количеством разделителей. Инструмент «Полярная сетка» создает концентрические круги заданного размера с заданным количеством разделителей.
Рисование прямоугольных сеток
Нажмите и удерживайте инструмент «Отрезок линии» (). Выберите инструмент «Прямоугольная сетка» .
Выполните одно из следующих действий:
Перетащите курсор, пока не получите сетку нужного размера.
Щелкните, чтобы задать неподвижную точку сетки. Чтобы определить точку, из которой будет нарисована сетка, щелкните в диалоговом окне квадратик на локаторе неподвижной точки . После этого задайте любые из следующих параметров и нажмите кнопку ОК .
Размер по умолчанию. Определяет ширину и высоту всей сетки.
Горизонтальные разделители. Определяет количество горизонтальных разделителей между верхним и нижним краями сетки. Значение «Асимметрично» позволяет распределять горизонтальные разделители неравномерно с увеличением их частоты в сторону верхнего или нижнего края сетки.
Вертикальные разделители. Определяет количество вертикальных разделителей между левым и правым краями сетки. Значение «Асимметрично» позволяет распределять вертикальные разделители неравномерно с увеличением их частоты в сторону левого или правого края сетки.
Использовать внешний прямоугольник в качестве рамки. Заменяет верхний, нижний, левый и правый сегменты отдельным прямоугольным объектом.
Окрашивать сетку в цвет заливки. Сетка окрашивается в текущий цвет заливки (в противном случае заливка не задается).
Рисование круговых (полярных) сеток
Нажмите и удерживайте инструмент «Отрезок линии» (). Выберите инструмент «Полярная сетка» .
Выполните одно из следующих действий:
Перетащите курсор, пока не получите сетку нужного размера.
Щелкните, чтобы задать неподвижную точку сетки. Чтобы определить точку, из которой будет нарисована сетка, щелкните в диалоговом окне квадратик на локаторе неподвижной точки . После этого задайте любые из следующих параметров и нажмите кнопку ОК .
Размер по умолчанию. Определяет ширину и высоту всей сетки.
Концентрические разделители. Определяет количество круговых концентрических разделителей в сетке. Значение «Асимметрично» позволяет распределять концентрические разделители неравномерно с увеличением их частоты в сторону внутренней или внешней части сетки.
Радиальные разделители. Определяет количество радиальных разделителей между центром и периферической частью сетки. Значение «Асимметрично» позволяет распределять радиальные разделители неравномерно с увеличением их частоты по часовой стрелке или против часовой стрелки.
Создать составной контур на основе эллипсов. Преобразует концентрические круги в отдельные составные контуры и добавляет в них заливку через один.
Окрашивать сетку в цвет заливки. Сетка окрашивается в текущий цвет заливки (в противном случае заливка не задается).
Читайте также: