определение областей на изображении

Тема в разделе "WASM.HEAP", создана пользователем ring4, 26 авг 2010.

  1. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    привет
    есть изо: http://savepic.ru/1600353.png

    необходимо определить координаты углов каждого квадрата. есть известные алгоритмы для поиска или работы с областями на изображении. а то выдумывать велосипед не хочется.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    ring4
    Ну так и называются угловой детектор. К примеру угловой детектор Хариса. Правда для вашей задачи не годится.
    Лучше выдумать.
     
  3. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Pavia
    спасибо, про детектор не знал, посмотрю.
    а то что придется выдумывать уже все чаще прихожу к этой мысли
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ring4
    Опишите контур попиксельно. Тогда точка в которой вектор меняется будет являться углом(находиться в вершине угла прим.).
    http://www.wasm.ru/forum/viewtopic.php?id=29695&p=1
     
  5. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    это ясно. для квадратов анализатор написал, там все просто, завтра попробую на свежую голову для мноугольников и прочих фигур.

    еще попробую скурить многослойные текстуры, может тогда будет вообще легко.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В данном случае достаточно просканировать по вертикали и горизонтали, в поиске вертикальных и горизонтальных линий, и далее найти все их пересечения.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.561
    Адрес:
    Russia
    Booster
    +100500 .
    ring4
    Ищите тупо все пересечения. И все.
     
  8. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    TermoSINteZ
    да это и ежу понятно.)

    тема закрыта, проблема решена.
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    А да я обшибся для вашего случая угловой детектор Хариса тоже работает.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Давайте прикинем эффективность. Пусть дан прямоугольник. Число его пиксель: Sf = dX * dY
    Является суммой числа пиксель составляющих внутренний сектор: Si = (dX - 2) * (dY - 2)
    и границу: Se = 2 * dX + 2 * dY, тоесть Sf = Si + Se.
    При поиске пересечений нужно перечислить все пиксели региона. При использовании способа(4) только границу. Тогда число лишних пиксель при поиске пересечений: Sp = Sf - Se = Si. Допустим имеется квадрат из 100 пиксель. Тогда лишнее число пиксель при енумерации: 100*100 - (2*100 + 2*100) = 9600 пиксель, это 96% от общего числа пиксель.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Это нетривиальный способ и в этом его минус.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Пробежаться слева-направо сверху-вниз квадратиком 2х2. Если внутри квадратика 3 черных и 1 белый, или наоборот, то это угол.
     
  13. IceBars

    IceBars New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2007
    Сообщения:
    384
    Адрес:
    Матрица
    Пожалуйста не пишите А&O в хипе. Я специально его не читаю.

    Идеальный алгоритм: нужно проследить обрыв горизонтальных линий и по ним найти начало и конец.

    Кто понял - молодец.
    (Прям как палка о двух концах.)
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    IceBars

    Идеальными бывают только отношения в мыльных операх.
     
  15. IceBars

    IceBars New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2007
    Сообщения:
    384
    Адрес:
    Матрица
    _DEN_
    прикольно :)

    (идеально) кратчайший путь от одной точки к другой - прямая линия.

    PS: точки не телепортируют:)
     
  16. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Вот здесь хорошо расписано
    http://cgm.computergraphics.ru/issues/issue17/invariant_features
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    Ваш этот матан никому не нужен, так как не имеет никакого отношения к решению задачи. Галок можно и без матчасти на битмапе наставить.
     
  18. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Clerk
    Ну зачем за всех говорить, Вам не нужен и ладно, может быть другим будет интересно узнать про разбор изображений.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Откопал у себя древнюю рукопись с алго заливки замкнутой фигуры, по сути это выделение на изображении всех областей методом в #4.
    (V - вектор, X и Y - координаты пикселя).
    o Если V = Up, то поверхность находится слева.
    o Если V = Up, то справа существует поверхность, в точке которой лежащей на одной оси X будет V = Down.

    0. Ищем поверхность справа от затравки.
    1. V = Down, TempXY = X, Y.
    - Описание поверхности в буфере. -
    2. Set(Buf, X, Y)
    3. X,Y = Next(X, Y) ; Определяем следующий пиксель и вектор.
    4. Если TempXY != X, Y и V = Down идём к п.2.

    5. Push(X, Y) ; Сохраняем в стеке.

    6. X, Y = Next(X, Y)
    7. Если V = Up идём к 13.
    8. Если V != Down идём к п.6.
    9. TempX, Y = Stack() ; Значение с вершины стека.
    Если X, Y != TempXY идём к п.6.
    10. Pop(TempXY)
    Pop(TempXY) ; Удаляем коорднинаты двух пиксель.
    11. Если стек исчерпан, то брейк.
    12. V = Up. Идём к п.6.

    13. Push(X, Y)

    14. X = X + 1
    15. Если Get(Scr, X, Y) идём к п.17.
    16. Out(X, Y). Идём к п.14.

    17. Если Get(Buf, X, Y) идём к п.1.
    18. Pop(X, Y). Идём к п.6.

    [​IMG]