Выровнять изображение горизонтально

Тема в разделе "WASM.A&O", создана пользователем Tronix, 5 ноя 2010.

  1. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Привет, есть допустим такое изображение:
    [​IMG]

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

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

    Нужно для программы распознавания штрих-кодов. Само распознавание сделал, но работает только с горизонтальными штрих-кодами.

    Идеи, мысли?
     
  2. Clerk

    Clerk Забанен

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

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    То есть находим первую черную точку, от нее проводим линию например сначала вверх, а потом постепенно линию крутив вокруг этой точки. Как только все точки под линией стали черными - значит это и есть угол. Правильно мысль понял?
    [​IMG]
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Стандартное решение это нахождение ориентированного бокса, для ускорения можно сильно понизить разрешение.
     
  5. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Извиняюсь, а что это? Гугл не многословен по поводу ориентированного бокса...
     
  6. Clerk

    Clerk Забанен

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

    Booster
    Вроде эффективность вашего решения последней подобной задачи была 96% паразитных итераций =)
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Бокс это описывающий прямоугольник. Ориентированный бокс имеет ориентацию не выровненную по осям.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Вы снова решили показать что все кроме вас овощи? ^)
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Если я ответил то это ничего не значит. Нечего предлагать не эффективные решения http://wasm.ru/forum/viewtopic.php?pid=394408#p394408. Как вы определите что пиксель принадлежит штриху, а не цифре к примеру без описания контура ?
     
  10. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    С самого лева - вправо, найти черную точку.
    Отступить чутку вниз и повторить предыдущий пункт.
    Соотношение двух отрезков даст угол наклона.

    На самом деле все не так просто: картинка может лежать как ей угодно(?)


    ред: обогнали с ответом
     
  11. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Clerk
    Наверное я тупой, но я не понимаю Вас. Честно, перечитал раз 10 каждое сообщение и не отдупляю ( А как я предложил крутить линию не получится?

    Начало штрих-кода я могу определить на не очень больших углах. Все дело в том, что это Code128 штрихкод, а они могут начинаться только с трех "нибблов":
    START_A : 11010000100
    START_B : 11010010000
    START_C : 11010011100
    где 1 - черная полоса, 0 - белая соответственно.
    Несложно приметить, что у всех этих трех "нибблов" общее начало - 110100 (две черные линии,белая, черная и две белых). С них и будет начинаться любой Code128 штрих-код.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Да, только Вы предлагаете самые лучшие и оптимальные решения.
     
  13. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    У меня есть предложение считать что штрихкод является прямой, а по координатам чёрных точек расчитывать её коэффициенты. Для длинных штрихкодов должно работать идеально.
     
  14. Pavia

    Pavia Well-Known Member

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

    Tronix
    Считаешь корреляционную матрицу. Потом находишь обратную. Применяешь ее в качестве матрицы аффинных преобразований.
     
  15. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Я бы просканировал изображение по пикселям. Нашел бы самый левый, самый нижний, верхний и правых. Логично предположить, что это и будут границы прямоугольника. А дальше - поворачивай, как хочешь
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Для распознавания это не нужно. :derisive:
     
  17. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    В смысле не нужно? Не нужно ничего поворачивать и Вы знаете алноритм который будет распознавать любой штрих-код под любым углом?
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Находим AABB, углы изображения будут лежать на его гранях, далее по этим углам найти ориентацию.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Pavia
    Какую есчо матрицу. Если приращение координат на двух участках описываемой линии больше чем лимит, то линия не прямая, это позволяет идентифицировать её. Вдобавок определить что пиксель принадлежит штриху можно только попиксельным описанием его, матрицы отдахают [​IMG](рис в пэйнте к сабжу). Графы лучше изучайте.

    http://wasm.ru/forum/viewtopic.php?id=38446
     
  20. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Tronix
    обсуждение алгоритма чтения штрихкода уже было. до решения. воспользуйтесь поиском