аналих картинки: нахождение нужных объектов

Тема в разделе "WASM.A&O", создана пользователем Sickboy, 20 май 2008.

  1. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    Столкнулся с подводным камнем) Нажно определить цвет пикселя и вывести в виде R=,G=,B= т.к если использовать APi Getpixel то цвет выводится одним числом. По возможности на VB, если таковой нет то и от C++ не откажусь
     
  2. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Sickboy
    По распознаванию. В твоем случае
    достаточно, разделив отдельные символы между собой, подсчитать количество внутренних замкнутых областей внутри каждого изображения: 2 для "8", 1 для "4" и "6", 0 для "7" и "2".
    затем нужно уже внутри группы произвести разделение: "8" уже распознано, "4" либо "6" выбирается по направлению "отростка" - вверх("6") либо вниз("4"), "7" либо "2" выбирается по наличию более-менее вертикальной линии внизу.

    Но это ТОЛЬКО в твоем случае!

    P.S. Если хочется посложнее - гистограммы и сети Кохонена.

    GetRValue() :derisive: ну или выделяй по маске и логическими сдвигами.
     
  3. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    GetRValue() :derisive:,Спасибо за идею, вот кстати ещё 1 способ, правда менее рационален.

    'Sub NRGB(Cols, R, G, B)
    'Dim Col1, Col2, ost1, ost2 As Single
    'B = Int(Cols / 65536)
    'Col1 = B * 65536
    'ost1 = Cols - Col1
    'G = Int(ost1 / 256)
    'Col2 = G * 256
    'ost2 = ost1 - Col2
    'R = ost2
    'If R < 1 Then R = 0
    'If R > 254 Then R = 255
    'If G < 1 Then G = 0
    'If G > 254 Then G = 255
    'If B < 1 Then B = 0
    'If B > 254 Then B = 255
    'End Sub

    'Private Sub Command4_Click()
    'i = GetPixel(Picture1.hdc, 14, 15)
    'Text1 = i
    'NRGB i, R, G, B
    'Text2 = R
    'Text3 = G
    'Text4 = B
    'Picture3.BackColor = RGB(R, G, B)
    'End Sub
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Погугли на тему морфологического анализа изображений, преобразования Карунена-Лоэва и проч. У нас на кафедре делали курсовую по распознаванию символов неизвестного алфавита =) Правда, другим методом. Но и этим тоже в другой курсовой.
    Хотя в данном случае можно обойтись и более простыми методами.. ИМХО :)
     
  5. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    Great
    И какие же это методы?)
     
  6. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    У меня получалось распознавать символы обычным многослойным персепторном.
    Сложного там нету ничего (если в дебри не соваться). Но здесь речь идет о нескольких символах. Вот если будет алгоритм, как разделить всю картинку на символы, затем смасштабировать ее и повернуть как надо... Да еще и толщину линий сделать одинаковую...
    Тогда процент верного распознавания каждого из символов будет очень большим, даже для разных шрифтов и шума.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Sickboy
    какие конкретно? :)
    процитируй ту часть моего сообщения, что имел в виду, я не понял просто
     
  8. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    Great
    Но и этим тоже в другой курсовой.
    Хотя в данном случае можно обойтись и более простыми методами.. ИМХО :)
     
  9. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    Span
    с шумом я почти разобрался. В несколько подходов его не стаёт. А вот про многослойный персепторн первый раз слышу) поподробнее можно?
     
  10. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Sickboy
    Ну это и есть выделение по маске
    Код (Text):
    1. mov eax, Color
    2. mov bl, al ; R
    3. mov cl, ah ; G
    4. shr eax, 16
    5. mov dl, al ; B
    Ну или
    Код (Text):
    1. R = Color && 0xFF;
    2. G = (Color >> 8) && 0xFF;
    3. B = (Color >> 16) && 0xFF;
    Ну или
    Код (Text):
    1. R := Color and $FF;
    2. G := (Color shr 8) and $FF;
    3. B := (COlor shr 16) and $FF;
    Извини, Бейсик не знаю толком, не напишу :) Но приведенный пример, ИМХО, очень нерационален.

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

    UPD:
    http://62.213.7.177/kiril/Library/Book1/content394/content394.htm

    P.S. И чем не подходит предложенный метод по подсчету числа замкнутых областей?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну не знаю, например просто FFT сделать и втыкать в частоты )) кажется выше предлагали уже.

    Ну да, есть такое дело.. (
    Зависит от размера изображения и размера алфавита. В определенных случаях может быть вполне рентабельно
     
  12. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    картинка с цветня, точнее на фоне чиние буквы сгладены, на границах оттенки получаются, я уже с этим разобрался, на выходе картинка с белым фоном и чёрными буквами. шум в виде 1, двух или 3 точек придумал как убрать. осталось только линии придумать как убрать. Щас немного напряг с экзаменами, 30 числ последний, потом серьёзно займусь.
     
  13. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Sickboy
    Сделай обычную эрозию с примитивом большим, чем толщина линии. Заодно и символы отделишь, если они соединены друг с другом. Если для уничтожения линий эрозия слишком сильно деформирует полезные элементы на растре, то сделай повторно дилатацию или замыкание.
     
  14. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Sickboy
    Для убирания мелких помех используй методы морфологической обработки: размыкания - замыкания (открытие - закрытие). Ими можно удалять небольшие помехи на изображении, либо при обратном использовании усиливать мелкие детали.
    В твоем случае сначала выполняется закрытие (удаление мелких деталей), затем открытие (искаженные существенные детали более-менее восстанавливаются).

    http://matlab.exponenta.ru/imageprocess/book2/66.php
    Ну и непосредственно Google.
     
  15. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Ссылку одну дали уже,
    но вот еще неплохая:
    http://www.intuit.ru/department/expert/neurocomputing/3/
    Автор А.А.Ежов. Очень рекомендую. Исходников полно по этим алгоритмам.
     
  16. Sickboy

    Sickboy New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    30
    С линиями попробую щас пока эти экзамены много времени нету. Линии просто проходят через буквы, иногда линии пересекаются или находяься так близко, что иногдаобразуют линию толщиной в 2 пикселя.
     
  17. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Sickboy
    Морфология поможет.
     
  18. Explode Sense

    Explode Sense New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2006
    Сообщения:
    130
    Адрес:
    Russia
    Xerx
    Не факт

    Sickboy
    Покажи хоть капчу-то свою, а то непонятно что именно делать. Тебе вон посоветуют морфологию, а у символов может толщина линий меньше, чем у мусора?
     
  19. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    А лучше сразу несколько штук. Тогда понятно будет, как меняется изображение.