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

Discussion in 'WASM.HEAP' started by ring4, Aug 26, 2010.

  1. ring4

    ring4 New Member

    Blog Posts:
    0
    Joined:
    Nov 19, 2006
    Messages:
    279
    привет
    есть изо: http://savepic.ru/1600353.png

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

    Pavia Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 17, 2003
    Messages:
    2,409
    Location:
    Fryazino
    ring4
    Ну так и называются угловой детектор. К примеру угловой детектор Хариса. Правда для вашей задачи не годится.
    Лучше выдумать.
     
  3. ring4

    ring4 New Member

    Blog Posts:
    0
    Joined:
    Nov 19, 2006
    Messages:
    279
    Pavia
    спасибо, про детектор не знал, посмотрю.
    а то что придется выдумывать уже все чаще прихожу к этой мысли
     
  4. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    ring4
    Опишите контур попиксельно. Тогда точка в которой вектор меняется будет являться углом(находиться в вершине угла прим.).
    http://www.wasm.ru/forum/viewtopic.php?id=29695&p=1
     
  5. ring4

    ring4 New Member

    Blog Posts:
    0
    Joined:
    Nov 19, 2006
    Messages:
    279
    это ясно. для квадратов анализатор написал, там все просто, завтра попробую на свежую голову для мноугольников и прочих фигур.

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

    Booster New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    В данном случае достаточно просканировать по вертикали и горизонтали, в поиске вертикальных и горизонтальных линий, и далее найти все их пересечения.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Booster
    +100500 .
    ring4
    Ищите тупо все пересечения. И все.
     
  8. ring4

    ring4 New Member

    Blog Posts:
    0
    Joined:
    Nov 19, 2006
    Messages:
    279
    TermoSINteZ
    да это и ежу понятно.)

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

    Pavia Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 17, 2003
    Messages:
    2,409
    Location:
    Fryazino
    А да я обшибся для вашего случая угловой детектор Хариса тоже работает.
     
  10. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Давайте прикинем эффективность. Пусть дан прямоугольник. Число его пиксель: 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

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    Clerk
    Это нетривиальный способ и в этом его минус.
     
  12. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Пробежаться слева-направо сверху-вниз квадратиком 2х2. Если внутри квадратика 3 черных и 1 белый, или наоборот, то это угол.
     
  13. IceBars

    IceBars New Member

    Blog Posts:
    0
    Joined:
    Jan 16, 2007
    Messages:
    384
    Location:
    Матрица
    Пожалуйста не пишите А&O в хипе. Я специально его не читаю.

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

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

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    IceBars

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

    IceBars New Member

    Blog Posts:
    0
    Joined:
    Jan 16, 2007
    Messages:
    384
    Location:
    Матрица
    _DEN_
    прикольно :)

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

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

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Вот здесь хорошо расписано
    http://cgm.computergraphics.ru/issues/issue17/invariant_features
     
  17. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    JCronuz
    Ваш этот матан никому не нужен, так как не имеет никакого отношения к решению задачи. Галок можно и без матчасти на битмапе наставить.
     
  18. JCronuz

    JCronuz New Member

    Blog Posts:
    0
    Joined:
    Sep 26, 2007
    Messages:
    1,240
    Location:
    Russia
    Clerk
    Ну зачем за всех говорить, Вам не нужен и ладно, может быть другим будет интересно узнать про разбор изображений.
     
  19. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Откопал у себя древнюю рукопись с алго заливки замкнутой фигуры, по сути это выделение на изображении всех областей методом в #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]