Растр ==> Вектор
От: Mika Soukhov Stock#
Дата: 26.09.03 14:22
Оценка:
Есть растровое изображение с изолиниями. Нужно эти самые изолинии сконвертировать в векторное представление (ну, грубо говоря, массив координат). Как бы мне это лучше сделать. Понимаю, что задачка довольно таки сложнаю, поэтому и не жду прямого ответа. Ждем-с прямых линков Почитать, поднатареть, обматериться (приобрести матерые вид ) я всегда люблю.

Заранее благодарю.
Re: Растр ==> Вектор
От: uzzy Россия  
Дата: 27.09.03 03:12
Оценка: 6 (1)
Здравствуйте, Mika Soukhov, Вы писали:

MS>Есть растровое изображение с изолиниями. Нужно эти самые изолинии сконвертировать в векторное представление (ну, грубо говоря, массив координат). Как бы мне это лучше сделать. Понимаю, что задачка довольно таки сложнаю, поэтому и не жду прямого ответа. Ждем-с прямых линков Почитать, поднатареть, обматериться (приобрести матерые вид ) я всегда люблю.


Возможно поможет первоначальное пропускание растра через фильтр, параметры фильтра скорее всего придется подбирать, хотя может и нет
про фильтры можно узнать поискав "цифровая обработка сигналов (изображений)", возможно даже по этому поиску что-нибудь будет и по твоей задаче

MS>Заранее благодарю.
... << RSDN@Home 1.1 beta 2 >>
Re: Растр ==> Вектор
От: Рома Мик Россия http://romamik.com
Дата: 27.09.03 12:58
Оценка: 24 (2)
Здравствуйте, Mika Soukhov, Вы писали:

MS>Есть растровое изображение с изолиниями. Нужно эти самые изолинии сконвертировать в векторное представление (ну, грубо говоря, массив координат). Как бы мне это лучше сделать. Понимаю, что задачка довольно таки сложнаю, поэтому и не жду прямого ответа. Ждем-с прямых линков Почитать, поднатареть, обматериться (приобрести матерые вид ) я всегда люблю.

Я так понял, что есть картинка и на ней некие линии их надо выделить и представить именно как линии.

Я бы сделал так. Перебираем все точки в изображении. Если в некотором небольшом радиусе от точки больше чем некоторое количество точек у которых больше чем на некую величину отличается хотя бы один компонент цвета, то заливаем эту точку, но не просто, а с некотрым допуском. Потом полученную область преобразуем в линию. Для этого, например, разбиваем область на кусочки и центры кусочков соединяем.
... << RSDN@Home 1.1 beta 2 >>
Re[2]: Растр ==> Вектор
От: uzzy Россия  
Дата: 27.09.03 16:44
Оценка: 18 (1)
Здравствуйте, uzzy, Вы писали:

Здесь представлено исходное изобаржение, и 2 результата применения одного и того же вида фильтров, кажется он имеет название "выделение контуров"). По идее что-то подобное позволит оставить на растре только изолинии, а вот что потом делать?
... << RSDN@Home 1.1 beta 2 >>
Re[3]: Растр ==> Вектор
От: Mika Soukhov Stock#
Дата: 27.09.03 19:54
Оценка:
Здравствуйте, uzzy, Вы писали:

U>Здравствуйте, uzzy, Вы писали:


U>Здесь представлено исходное изобаржение, и 2 результата применения одного и того же вида фильтров, кажется он имеет название "выделение контуров"). По идее что-то подобное позволит оставить на растре только изолинии, а вот что потом делать?


Я что то не уверен в данном подходе. На сколько я понял, "выделение контуров" годиться только для полноценных изображение, у меня же уже фактически контуры. Так же на изображении уже присутствуют изолинии. Единственное что, так это там могут располагаться различные побочные элементы (то скупая засохшая слеза пьяного геолога, положившего под сканер свое творение). Твой же алгоритм сделает только то, что обьведет эти сужности, а так же может и удалить не нужные изолинии.
Re[4]: Растр ==> Вектор
От: Рома Мик Россия http://romamik.com
Дата: 27.09.03 20:44
Оценка: +1
Здравствуйте, Mika Soukhov, Вы писали:

Кстати если бы ты положил пример картинки, то было бы гораздо понятнее что требуется...
... << RSDN@Home 1.1 beta 2 >>
Re: Растр ==> Вектор
От: piAnd Россия  
Дата: 28.09.03 08:13
Оценка: 12 (1)
Здравствуйте, Mika Soukhov, Вы писали:

MS>Есть растровое изображение с изолиниями. Нужно эти самые изолинии сконвертировать в векторное представление (ну, грубо говоря, массив координат). Как бы мне это лучше сделать. Понимаю, что задачка довольно таки сложнаю, поэтому и не жду прямого ответа. Ждем-с прямых линков Почитать, поднатареть, обматериться (приобрести матерые вид ) я всегда люблю.


MS>Заранее благодарю.

Я бы попробовал на MathCad-е отладить алгоритм.
Сначала преобразовать изображение к монохромному(2 цвета) с помощью какого-нибудь фильтра, чтобы исключить случайные всплески и незначительные перепады яркости(смотреть в сторону дифференцирующего фильтра или что-то вроде оператора Собеля и ему подобных).
После чего у нас имеется набор точек одного цвета.
Далее ищем на изображении все точки, расстояния между которыми равны 1 пикселю(вообще определяется качеством исходной картинки и разрешением) — это точки одной изолинии.
Дальше среди выбранных точек изолинии с некоторым шагом (если мин растояние между точками 1 пиксел, то скажем возьмем шаг=10пикселей) ищем точки растояние между которыми =шагу.
Полученный набор точек есть набор узлов изолинии, который собстно и есть векторное представление...
Это просто идея решить задачу "в лоб"
К недостаткам можно отнести —
1) только хорошая исходная картинка даст мин растояние в 1 пиксел между соседними точками.
2) если ширина изолинии больше 1 пикс., то шаг узлов должен быть больше 1 пикселя, что уменьшает точность векторного представления...
Возможно уже существуют алгоритмы, только ссылок незнаю(((
Re[5]: Растр ==> Вектор
От: Mika Soukhov Stock#
Дата: 28.09.03 08:26
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Здравствуйте, Mika Soukhov, Вы писали:


РМ>Кстати если бы ты положил пример картинки, то было бы гораздо понятнее что требуется...


Re: Растр ==> Вектор
От: klovetski Россия  
Дата: 28.09.03 17:53
Оценка: 6 (1)
Здравствуйте, Mika Soukhov, Вы писали:

MS>Есть растровое изображение с изолиниями. Нужно эти самые изолинии сконвертировать в векторное представление


Попробуй заглянуть на здесь. Там есть демонстрационка Grafula3 для оцифровки графиков и список программ конкурентов. Может и наткнешься на что-то интересное.

Есть еще Graph2Digit
от Вячеслава Плиско.
e-mail: plsoft@narod.ru
http:\\plsoft.narod.ru, http:\\plsoft.chat.ru

Этой я пользовался. Если убрать текст и цифры на твоих графиках, то она, может быть и справится. Я, правда, пробовал ее только для однозначных функций, понравилось.


Константин
Re: Растр ==> Вектор
От: Кирилл Осенков Украина
Дата: 28.09.03 18:40
Оценка: 20 (3)
Adobe Streamline 4.0 занимается векторизацией растровых изображений. Правда там вряд ли есть описание

А что касается алгоритма, мне вспомнились недавние обсуждения Поиска связанных областей в двухмерном массиве
Автор: golyakov
Дата: 29.08.03
. Только там была 4-связность, т.е. соседями считались пикселы строго слева/справа/снизу/сверху, а в твоей задаче нужна 8-связность — т.е. соседями считаются еще и диагональные клетки.

Так что если не вдаваться в детали план может быть такой:

  1. Убить все дефекты на исходном изображении и поприменять всякие фильтры.
  2. Найти все компоненты 8-связности, т.е. такие наборы пикселей, что от каждого пикселя из набора можно перебраться до любого другого пикселя из этого набора, перемещаясь по соседям (8 направлений). Это можно сделать некоторой модификацией алгоритма построчного сканирования (могу дать код на VB.NET). Здесь другая проблема — всякие артефакты, разрывы линий на рисунке и т.д.
  3. В каждой компоненте связности постараться упорядочить пикселы, т.е. выстроить по цепочке — у большинства пикселей два соседа. Получится ломаная.
  4. Пройтись по ломаной — если какой-то из пикселей находится точно посередине между своими соседями — убить
  5. Интерполировать эту ломаную, или приблизить кривыми Безье или еще чем удобнее. Т.е. получить кривые в требуемом представлении (главное добраться хотя бы до ломаных — уже дальше есть наработанная математика — интерполяция и т.д.)

Сорри за убогость, все чем мог...
Re: Растр ==> Вектор
От: zrs  
Дата: 29.09.03 06:42
Оценка: 6 (1)
Здравствуйте, Mika Soukhov, Вы писали:

AutoTrace — converts bitmap to vector graphics http://autotrace.sourceforge.net/
Софт с исходниками и судя по скриншотам вполне достойный. Кроме того есть ссылки на что почитать.
... << RSDN@Home 1.1 beta 2 >>
Re[6]: Растр ==> Вектор
От: Рома Мик Россия http://romamik.com
Дата: 29.09.03 09:18
Оценка: 12 (2)
Здравствуйте, Mika Soukhov, Вы писали:

MS>

Ну для такой-то картинки всякие извраты можно считать лишними. Выделяем связные области черного цвета, считая соседними для точки 8 или даже 16 точек.
Для каждой связной области пытаемся представить ее как линию. Т.е. от любой точки двигаемся по этой связной области стараясь делать как можно более маленькие повороты, одновременно удаляя проходимые и находящиеся сбоку/сзади по ходу движения из области.
Можно сразу пытаться строить квадратичную кривую, т.е. от произвольной точки подбирать ее параметры, так чтобы кривая как можно дальше ( или просто дальше, чем сколько-то ) оставалась в пределах области. Следующую кривую надо уже строить так чтобы первые производные у нее были равны предыдущим.
... << RSDN@Home 1.1 beta 2 >>
Re[2]: Растр ==> Вектор
От: Mika Soukhov Stock#
Дата: 29.09.03 19:27
Оценка:
Здравствуйте, piAnd, Вы писали:

A> Сначала преобразовать изображение к монохромному(2 цвета) с помощью какого-нибудь фильтра, чтобы исключить случайные всплески и незначительные перепады яркости(смотреть в сторону дифференцирующего фильтра или что-то вроде оператора Собеля и ему подобных).


Можно по подробнее про алгоритм?
Re[7]: Растр ==> Вектор
От: Mika Soukhov Stock#
Дата: 29.09.03 19:52
Оценка:
Здравствуйте, Рома Мик, Вы писали:

Кстати, заметил еще такие штуки как прямей линии. Я вот думаю, их бы тоже надобно отфильтровать. Как бы мне это определить? Максимальным углом отклонения по всей ломаной пройтись и если не превышает заданный уровень, то стереть. А есть еще какой нить способ? Что то мне подсказывает что можно и градиентой измерить. Но тогда нужно уравнение составить. Туда ли я копаю?
Re[2]: Растр ==> Вектор
От: Mika Soukhov Stock#
Дата: 29.09.03 19:52
Оценка:
Здравствуйте, Кирилл Осенков, Вы писали:

КО>
  • Интерполировать эту ломаную, или приблизить кривыми Безье или еще чем удобнее. Т.е. получить кривые в требуемом представлении (главное добраться хотя бы до ломаных — уже дальше есть наработанная математика — интерполяция и т.д.)

    Кстати, мне как раз нужно их перевести в кривые Безье. А как это сделать? Я раньше шел наоборот
  • Re[8]: Растр ==> Вектор
    От: Рома Мик Россия http://romamik.com
    Дата: 29.09.03 20:37
    Оценка:
    Здравствуйте, Mika Soukhov, Вы писали:

    MS>Здравствуйте, Рома Мик, Вы писали:


    MS>Кстати, заметил еще такие штуки как прямей линии. Я вот думаю, их бы тоже надобно отфильтровать. Как бы мне это определить? Максимальным углом отклонения по всей ломаной пройтись и если не превышает заданный уровень, то стереть. А есть еще какой нить способ? Что то мне подсказывает что можно и градиентой измерить. Но тогда нужно уравнение составить. Туда ли я копаю?

    Ну проверить является ли некая область прямой очень просто, на через две достаточно удаленные друг от друга точки области провести прямую и проверить, что все точки области лежат недалеко от этой прямой.
    ... << RSDN@Home 1.1 beta 2 >>
    Re[3]: Растр ==> Вектор
    От: Рома Мик Россия http://romamik.com
    Дата: 29.09.03 21:19
    Оценка:
    Здравствуйте, Mika Soukhov, Вы писали:

    MS>Здравствуйте, Кирилл Осенков, Вы писали:


    КО>>
  • Интерполировать эту ломаную, или приблизить кривыми Безье или еще чем удобнее. Т.е. получить кривые в требуемом представлении (главное добраться хотя бы до ломаных — уже дальше есть наработанная математика — интерполяция и т.д.)

    MS>Кстати, мне как раз нужно их перевести в кривые Безье. А как это сделать? Я раньше шел наоборот

    Чего-то я все эти дела подзабыл, Безье — это кривая у которой заданы конечные точки через которые она проходит и некие вектора в этих точках, которых она будет касаться в этих точках?

    Я бы строил так: берем крайнюю точку, находим направление кривой в ней идем вдоль линии и в каждой точке находим направление касательной к кривой, пытаемся строить кривую ( видимо придется подгонять как-то длины векторов или обойтись вторым порядком, что было бы совсем неплохим выбором ИМХО ), пока кривая лежит недалеко от промежуточных точек идем дальше, потом строим следующий отрезок и т.д. пока не дойдем до конца...
    ... << RSDN@Home 1.1 beta 2 >>
  • Re[4]: Подзадача: цепочка пикселов => кривая Безье
    От: Кирилл Осенков Украина
    Дата: 30.09.03 14:02
    Оценка: 44 (3)
    РМ>Чего-то я все эти дела подзабыл, Безье — это кривая у которой заданы конечные точки через которые она проходит и некие вектора в этих точках, которых она будет касаться в этих точках?
    Ага — две точки — концы, еще две — направляющие точки (направления касательных в концах), причем чем дальше направляющая точка от соответствующего конца кривой — тем плотнее прилегает кривая к касательному вектору в точке касания.

    На практике считается так:

    cx=3*(x1-x0)
    bx=3*(x2-x1)-cx
    ax=x3-x0-bx-cx
    
    cy=3*(y1-y0)
    by=3*(y2-y1)-cy
    ay=y3-y0-by-cy
    
    x(t)=ax*t^3+bx*t^2+cx*t+x0
    y(t)=ay*t^3+by*t^2+cy*t+y0
    
    t из [0;1]


    РМ>Я бы строил так: берем крайнюю точку, находим направление кривой в ней идем вдоль линии и в каждой точке находим направление касательной к кривой, пытаемся строить кривую ( видимо придется подгонять как-то длины векторов или обойтись вторым порядком, что было бы совсем неплохим выбором ИМХО ), пока кривая лежит недалеко от промежуточных точек идем дальше, потом строим следующий отрезок и т.д. пока не дойдем до конца...

    Присоединяюсь. Т.е. если предположить, что мы попали в сказку и кто-то подарил нам такую цепочку пикселов (массив пикселов от 1 до n, причем у каждого пиксела кроме концов ровно два соседа (если брать 8-связность)), то задача сводится к тому, чтобы откусывать от цепочки пикселей по одной кривой Безье, пока ее всю не съедим

    А откусывать наверное так. Для описания кривой Безье нам нужны восемь вещественных параметров. Один конец кривой нам известен — пиксел номер 1. Это уже два параметра.
    Направление касательной в первом конце можно посчитать — это третий параметр.

    Теперь в цикле по k от 2 до n пробуем взять пиксел номер k в качестве второго конца кривой и на каждом шаге k получаем еще три параметра.

    При переборе от 2 до n (т.е. при поиске второго конца, где откусывать) может помочь еще такое соображение. Внутренний голос подсказывает (кстати, я ему не совсем верю ), что на невырожденной кривой Безье ее кривизна может обнуляться максимум в двух точках. Где кривизна обнуляется, там кривая очень хорошо приближается прямой — и следовательно может выгнуться в другую сторону (или нет — это зависит от того, меняет ли кривизна знак в точке обнуления).
    Если бы мы умели хотя бы приближенно оценивать кривизну нашей цепочки в пикселе k, мы бы знали, где остановиться — наткнулись на третье обнуление кривизны — это почти наверняка второй конец искомой кривой, дальше пробовать уже не надо.

    Кривизна ломаной в ее вершине — это ориентированный угол между двумя выходящими из этой вершины звеньями. А теперь вспомним, что у нас очень выгодная ломаная — дискретная. Эта кривизна в каждом пикселе может принимать только 5 (ну от силы 7) значений. Нарисуйте цепочку из трех пикселов и станет ясно, почему. Поэтому отслеживать изменения знака кривизны цепочки должно быть несложно (надо только наловчиться считать кривизну — ее придется как-то усреднять, потому что помните, какие зубчики в алгоритме Брезенхема — то поворот влево на 90°, то вправо).

    В итоге, чтобы восстановить кривую по цепочке от первого до k-го пиксела недостает два параметра — удаление направляющих точек от соответствующих концов кривой. Их надо находить так, чтобы кривая при рендеринге лучше всего покрывала цепочку от 1 до k. Как это сделать, я сейчас не скажу, т.к. не знаю Но думаю, что каким-то перебором они и найдутся (перебор небольшой, дискретное двумерное пространство, тем более искомые расстояния ограничены сверху).

    Слабые места в этой писанине такие:


    О блин... Одни слабые места
    Re[5]: Подзадача: цепочка пикселов => кривая Безье
    От: Рома Мик Россия http://romamik.com
    Дата: 30.09.03 15:03
    Оценка: 8 (1) +1
    Здравствуйте, Кирилл Осенков, Вы писали:

    РМ>>Я бы строил так: берем крайнюю точку, находим направление кривой в ней идем вдоль линии и в каждой точке находим направление касательной к кривой, пытаемся строить кривую ( видимо придется подгонять как-то длины векторов или обойтись вторым порядком, что было бы совсем неплохим выбором ИМХО ), пока кривая лежит недалеко от промежуточных точек идем дальше, потом строим следующий отрезок и т.д. пока не дойдем до конца...

    КО>попали в сказку и кто-то подарил нам такую цепочку пикселов (массив пикселов от 1 до n, причем у каждого пиксела кроме концов ровно два соседа (если брать 8-связность)),
    Ну составить такую цепочку было бы не проблематично, но ИМХО она и не нужна. И можно брать больше чем 8-связности.

    КО>

    КО>О блин... Одни слабые места

    Ну, это пессимистичный взгляд — люди и не такое оцифровывают...

    Кстати не обязательно использовать именно Безье. Можно и квадратичными кривыми обойтись в данном случае, а считать и перебирать уже меньше.
    ... << RSDN@Home 1.1 beta 2 >>
    Re[6]: Подзадача: цепочка пикселов => кривая Безье
    От: Mika Soukhov Stock#
    Дата: 30.09.03 16:15
    Оценка:
    Здравствуйте, Рома Мик, Вы писали:

    Народ, можно как нить по проще и понятнее (без воды ). Я математику уже стал поздзабывать, так, плиз, еще и по доходчивее
    Re[7]: Подзадача: цепочка пикселов => кривая Безье
    От: Рома Мик Россия http://romamik.com
    Дата: 01.10.03 12:21
    Оценка:
    Здравствуйте, Mika Soukhov, Вы писали:

    MS>Здравствуйте, Рома Мик, Вы писали:


    MS>Народ, можно как нить по проще и понятнее (без воды ). Я математику уже стал поздзабывать, так, плиз, еще и по доходчивее

    Да вроде никакой воды...
    А расписать все подробно и по пунктам — это как код написать, а код написать — это за деньги и потом, или за большие деньги...
    ... << RSDN@Home 1.1 beta 2 >>
    Re[6]: Подзадача: цепочка пикселов => кривая Безье
    От: Кирилл Осенков Украина
    Дата: 01.10.03 15:49
    Оценка: 45 (2)
    КО>>попали в сказку и кто-то подарил нам такую цепочку пикселов (массив пикселов от 1 до n, причем у каждого пиксела кроме концов ровно два соседа (если брать 8-связность)),
    РМ>Ну составить такую цепочку было бы не проблематично, но ИМХО она и не нужна. И можно брать больше чем 8-связности.
    Если честно, я плохо представляю себе, а как без цепочки?
    Было бы классно знать более-менее конструктивный способ, использующий такой массив с утолщениями и аномалиями (а не цепочку):


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

    А связности — да, согласен, я порассматривал Микину картинку через лупу — конечно, ужас Но ты прав, отчаиваться не стоит — вон люди из Adobe как умеют, не говоря уже об орлах из Abbyy... Понятно, задача решаемая. Но сложная.

    Так вот. Предлагаю взять такую связность:

    01110
    11111
    11*11
    11111
    01110


    Здесь для пиксела "*" соседними будут считаться пикселы "1". Так мы соединим разрывы в 1 пиксел, но не более (а этого и достаточно, остальные разрывы будем считать двумя кусками).

    РМ>Совсем точно не найдем, найдем менее точно: кусочки кривой безье будут покороче, но все равно будут. А искать, я бы искал так: берем прямую, проходящую нашу точку и вращаем ее ( вариантов углов поворота не так много, так как прямая наша довольно коротка ), какой вариант покрывает наибольшее число точек нашей кривой, тот и есть искомое направление. Кроме того количество покрытых пикселей явно должно коррелировать с длиной вектора от первой ко второй точке. А более точного направления нам не надо, так как его просто и нет в природе, поскольку задана то нам только множество точек в которое можно вписать сколько хочешь кривых.

    Да, вообще да. Я подумал, твой фокус с прямой можно оптимизировать. Подбирать ее не нужно — ее можно восстановить по алгоритму Брезенхема. Смотри — прямая рисуется как набор горизонтальных или вертикальных отрезков примерно равной длины. Я имею ввиду:

    0000000*00
    0000000*00
    000000*-00
    0000**0000
    00+*000000
    0000000000


    Здесь на рисунке + это начало нашей будущей кривой, а звездочки — пикселы, которые надо покрыть. Минусом на рисунке отмечен пиксел, где цепочка начинает уклоняться от прямой. Смотрим — ага, первое время это состыкованные горизонтальные отрезки по два пиксела — вот и будем продолжать этот "паттерн" (узор), пока вписываемся в алгоритм Брезенхема. Как получим очередной отрезок неправильной длины (там, где минус — горизонтальная полоска из 1 пиксела, а не из двух) — значит цепочка отклонилась от прямой. Теперь то, что уже насчитали (от плюса до минуса) — часть нужной нам касательной прямой. Ее уравнение найти просто — она проходит через исходную точку (+ на рисунке) и угловой коэффициент — разделить разность игреков плюса и минуса на разность иксов.

    КО>>
  • Мои воздушные рассуждения о том, что поиск второго конца можно прерывать после нахождения третьего обнуления кривизны.
    РМ>ИМХО поиск можно прерывать, когда например из десяти наскоро посчитанных точек кривой две окажутся вне множетсва точек.
    Это эмпирика. К тому же мне кажется, ты как-то скромно берешь — с таким же успехом отлично можно и отрезками приближать.

    КО>>
  • Опять же, достаточно точно оценить кривизну в нашей дискретной задаче скорее всего не удастся.
    КО>>
  • Как искать удаление направляющих точек от концов кривой — вообще неясно (ну т.е. мне не ясно )
    РМ>Я там выше писал про покрытие точек прямой, так вот их кол-во после какого-то несложного преобразования ( возможно по таблице, полученной эмпирически ) должно дать примерное значение, вокруг которого можно искать перебором или даже оставить так.
    Да, но перебор все-таки достаточно большой...

    РМ>Ну использование более чем 8-связности от маленьких разрывов убережет, а большие пусть и остаются — получится две линии вместо одной и все.

    ОК.

    КО>>изломы, самопересечения,

    РМ>В принципе при вращении кривой эти штуки опредятся как два максимума только в одной стороне ( изломы ) два максимума с обеих сторон ( пересечения ). В изломах можно и прервать кривую, а в пересечениях продолжатьь в нужном направлении.
    Щас, я не понял. Что ты имеешь ввиду? Здесь можешь поподробнее плз?

    КО>>замкнутость в кольцо,

    РМ>Где тут проблема?
    ОК ОК согласен

    КО>>толщина в 2 и больше пиксела (а толщина в два пиксела, зараза, сплошь и рядом встречается на приведенной картинке),

    РМ>Не страшна. Какие проблемы она создает?
    Да понимаешь — вот у нас массив пар (x,y) от 1 до 10000. Больше ничего не знаем. И что с этим делать? Как ты поймешь, что кривую нужно направлять в "самую тонкую сторону"? И глянь на рисунок — там есть жирные перекрестки из пяти и больше таких "кишок"... Че с ними делать, я не знаю...

    КО>>раздавленные комары, пыль и вообще все плохо

    РМ>Комаров я там не заметил, а пыль — можно просто выкидывать слишком мелкие куски.
    Не знаю. Там кусок 6х6 — мы-то с тобой понимаем, что его надо выкинуть, а компу как объяснить?

    КО>>О блин... Одни слабые места

    РМ>Ну, это пессимистичный взгляд — люди и не такое оцифровывают...
    Согласен, у страха глаза велики

    РМ>Кстати не обязательно использовать именно Безье. Можно и квадратичными кривыми обойтись в данном случае, а считать и перебирать уже меньше.

    Ну да, это Mika просто упомянул, что ему кривые Безье нужны — а так конечно, с квадратичными проблем гораздо меньше. Дело в том, что квадратичная кривая — это кривая Безье, у которой две направляющие точки совпадают, а следовательно, находятся на пересечении двух касательных прямых в концах кривой. Все наши рассуждения остаются, более того: как только мы отыщем касательные прямые в концах с достаточной точностью, сразу появится третья точка (в точке их пересечения) — и квадратичная кривая найдена.
  • Re: Растр ==> Вектор
    От: Кирилл Осенков Украина
    Дата: 01.10.03 17:12
    Оценка: 6 (1)
    Есть одно из лучших собраний алгоритмов компьютерной графики: пятитомник Graphics Gems. Очень советую. И еще, говорят, что в пятом томе на стр. 323 лежит то, что тебе нужно

    Кстати, я еще погуглил "vectorization line tracing algorithm" — вроде кое-что там есть, хотя алгоритма я пока не видел.

    Вот глянь например:
    http://gis.esri.com/library/userconf/proc97/proc97/to200/pap193/p193.htm
    http://geopro.cic.ipn.mx/Extended%20Abstract%20EB.pdf
    http://www.penguin.cz/~fojtik/vectoris/vektoris.htm
    http://www.rfai.li.univ-tours.fr/RFAI/rapports/ram98b.pdf
    Re[7]: Подзадача: цепочка пикселов => кривая Безье
    От: Рома Мик Россия http://romamik.com
    Дата: 01.10.03 18:55
    Оценка: 12 (1)
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>>>попали в сказку и кто-то подарил нам такую цепочку пикселов (массив пикселов от 1 до n, причем у каждого пиксела кроме концов ровно два соседа (если брать 8-связность)),

    РМ>>Ну составить такую цепочку было бы не проблематично, но ИМХО она и не нужна. И можно брать больше чем 8-связности.
    КО>Если честно, я плохо представляю себе, а как без цепочки?
    КО>Было бы классно знать более-менее конструктивный способ, использующий такой массив с утолщениями и аномалиями (а не цепочку):
    Как определить направление в данной точке без цепочки я уже писал. Вторая проблема — это движение вдоль линии. Но имея направление, разве это проблема? Третья проблема — это выкидывать те точки, для которых кривая уже построена, так как при движении вдоль мы будем проходить не через все точки. Но в принципе и это не проблема, так как можно помечать все находящиеся рядом с проходимыми.

    КО>Так вот. Предлагаю взять такую связность:

    Ну это вопрос не принципиальный имхо, но я себе именно такую и представлял.

    КО>Я подумал, твой фокус с прямой можно оптимизировать. Подбирать ее не нужно — ее можно восстановить по алгоритму Брезенхема.

    Правильно, только надо для случаев с более чем единичной толщиной расширить. Т.е. рассамтривать не одну прямую, а множество возможных, потихоньку их одну за одной отбрасывая.

    КО>>>
  • Мои воздушные рассуждения о том, что поиск второго конца можно прерывать после нахождения третьего обнуления кривизны.
    РМ>>ИМХО поиск можно прерывать, когда например из десяти наскоро посчитанных точек кривой две окажутся вне множетсва точек.
    КО>Это эмпирика. К тому же мне кажется, ты как-то скромно берешь — с таким же успехом отлично можно и отрезками приближать.
    Ну это я так, к примеру, а вообще изначально мне казалось, что надо всю кривую в масшатабе рисунка восстанавливать и чтобы она вся укладывалась в наши точки.

    КО>>>
  • Опять же, достаточно точно оценить кривизну в нашей дискретной задаче скорее всего не удастся.
    КО>>>
  • Как искать удаление направляющих точек от концов кривой — вообще неясно (ну т.е. мне не ясно )
    РМ>>Я там выше писал про покрытие точек прямой, так вот их кол-во после какого-то несложного преобразования ( возможно по таблице, полученной эмпирически ) должно дать примерное значение, вокруг которого можно искать перебором или даже оставить так.
    КО>Да, но перебор все-таки достаточно большой...
    В том-то и штука, что перебор вокруг приблизительного значения, то есть сильно меньший, чем мог бы быть.
    А вообще отказавшись от Безье, в пользу кривых второго порядка, можно избежать перебора вообще.

    КО>>>изломы, самопересечения,

    РМ>>В принципе при вращении кривой эти штуки опредятся как два максимума только в одной стороне ( изломы ) два максимума с обеих сторон ( пересечения ). В изломах можно и прервать кривую, а в пересечениях продолжатьь в нужном направлении.
    КО>Щас, я не понял. Что ты имеешь ввиду? Здесь можешь поподробнее плз?
    Если мы имеем излом, и попытаемся найти направление фокусом с кривой, то ничего не выйдет, направления будет два и односторонних, а для пересечения будет просто два направления. Оба случая можно корректно обработать.

    КО>>>толщина в 2 и больше пиксела (а толщина в два пиксела, зараза, сплошь и рядом встречается на приведенной картинке),

    РМ>>Не страшна. Какие проблемы она создает?
    КО>Да понимаешь — вот у нас массив пар (x,y) от 1 до 10000. Больше ничего не знаем. И что с этим делать? Как ты поймешь, что кривую нужно направлять в "самую тонкую сторону"?
    А фокус с прямой зачем?
    КО>И глянь на рисунок — там есть жирные перекрестки из пяти и больше таких "кишок"... Че с ними делать, я не знаю...
    Не начинать с перекрестков. А на ходу, когда уже известно предыдущее направление проще выбрать правильное.

    КО>>>раздавленные комары, пыль и вообще все плохо

    РМ>>Комаров я там не заметил, а пыль — можно просто выкидывать слишком мелкие куски.
    КО>Не знаю. Там кусок 6х6 — мы-то с тобой понимаем, что его надо выкинуть, а компу как объяснить?
    Выкидывать те, где не прошел фокус с кривой...

    РМ>>Кстати не обязательно использовать именно Безье. Можно и квадратичными кривыми обойтись в данном случае, а считать и перебирать уже меньше.

    КО>Ну да, это Mika просто упомянул, что ему кривые Безье нужны — а так конечно, с квадратичными проблем гораздо меньше. Дело в том, что квадратичная кривая — это кривая Безье, у которой две направляющие точки совпадают, а следовательно, находятся на пересечении двух касательных прямых в концах кривой. Все наши рассуждения остаются, более того: как только мы отыщем касательные прямые в концах с достаточной точностью, сразу появится третья точка (в точке их пересечения) — и квадратичная кривая найдена.
    Во-во, и я о том же.
    ... << RSDN@Home 1.1 beta 2 >>
  • Re[8]: Подзадача: цепочка пикселов => кривая Безье
    От: Кирилл Осенков Украина
    Дата: 02.10.03 21:16
    Оценка:
    РМ>Как определить направление в данной точке без цепочки я уже писал. Вторая проблема — это движение вдоль линии. Но имея направление, разве это проблема? Третья проблема — это выкидывать те точки, для которых кривая уже построена, так как при движении вдоль мы будем проходить не через все точки. Но в принципе и это не проблема, так как можно помечать все находящиеся рядом с проходимыми.
    Ну, от этих рассуждений до алгоритма еще довольно далеко (еще много неясностей), но путь ты указал — и я с тобой согласен. Теперь уже наверное можно пробовать кодить

    P.S. Здесь очень важны дизайн и структуры данных — в процессе написания алгоритм будет сильно эволюционировать.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.