Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознование графики 
:(
    Опции темы
former
  Дата 12.4.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



Каким образом можно распознать объекты на рисунке (прямоугольники, элипсы и т.д.), используя при этом библиотеку похожих по форме элементов, и преобразовать их в отдельные векторные элементы.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 13.4.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 13.4.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



Цитата

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


Картинка составлена из множества многоугольников (10-20 шт.) разных размеров и сложной формы, но с прямыми углами (не фотография, нарисована в CorelDraw или др. проге). Эти многоугольники необходимо распознать и сравнить каждый с библиотечным по подобию формы (размеры могут не соответствовать). Если соответствие не найдено, добавить в библиотеку.

По поводу заливки не знаю. Может быть её стоит делать разных цветов, что бы было проще определять тип элемента?

Пример картинки могу скинуть на мыло.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 14.4.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(former @ 13.4.2006, 16:11 Найти цитируемый пост)
Пример картинки могу скинуть на мыло.

лучше сделать ссылку чтоб все могли посмотреть...

однородная заливка не повредит, но сильно не поможет

Первое что нужно сделать - матрица размера - соответствующего размерам картинки, в ней будем устанавливать флаги пикселей проверил - не проверил.

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

Следующий этап будет распозновании линиий. Попробуйте реализовать вначале первые два.

ps если не куда повесить картинку - пришлите я сам сделаю ссылку.

Это сообщение отредактировал(а) alexeis1 - 14.4.2006, 09:39


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 14.4.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



Картинку отправил на E-mail.

Цитата

Первое что нужно сделать - матрица размера - соответствующего размерам картинки, в ней будем устанавливать флаги пикселей проверил - не проверил.


alexei-s1, я работал только спростейшей графикой, а с пиксельной ещё
не доводилось. Как это можно реализовать?

Цитата

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


А если тощина линии более одного пикселя?


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
former
Дата 14.4.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



Вообще, какие требования далжны быть к изображению?


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 17.4.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(former @  14.4.2006,  20:48 Найти цитируемый пост)
alexei-s1, я работал только спростейшей графикой, а с пиксельной ещё
не доводилось. Как это можно реализовать?


Я имел ввиду 
Код

var
  m : array[0..MyImageHeight - 1, 0..MyImageWidth - 1] of Byte;
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 17.4.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(former @  14.4.2006,  21:32 Найти цитируемый пост)
Вообще, какие требования далжны быть к изображению?


требования как правило предъявляют не к изображению, а к алгоритму распознавания.

Вообще нельзя использовать Jpeg для хранения изображения.

Задача во многом упростится если делать такие чертежи в векторном редакторе, типа visio или АutoCad, тогда даже не придется распозновать линнии, так как они уже будут заданы в файле векторного формата.

Вообще, очень рекомендую перейти от растровой к векторной графике, тем более что круг задач как раз к этому распологает.
 smile  

-----------------------------------------------------------------------------------------
По просьбе автора я выкладывою пример изображения
Брать отсюда 

Это сообщение отредактировал(а) alexeis1 - 17.4.2006, 11:07


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 17.4.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



А я и использую bmp, просто отправил в jpg.

Код

Я имел ввиду 

var
  m : array[0..MyImageHeight - 1, 0..MyImageWidth - 1] of Byte;


Я так понял, что создаётся динамический массив, который заполняется элементами изображения, т.е. цветом пикселя, так? Как тогда осуществлять проверку цвета пикселя (чёрный/белый), и как свормировать из этого массива элементы изображения, т.е. разбить изображение на отдельные элементы?  Получается, что после этого необходимо попиксельно сравнить элемент из библиотеки? smile 
 
Код

Задача во многом упростится если делать такие чертежи в векторном редакторе, типа visio или АutoCad, тогда даже не придется распозновать линнии, так как они уже будут заданы в файле векторного формата.


Но тогда надо знать сам формат и уметь считать его из файла.

 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 18.4.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(former @  17.4.2006,  20:58 Найти цитируемый пост)
Но тогда надо знать сам формат и уметь считать его из файла.


форматы *.emf, и *.wmf , являются общепризнаными и информация об их формате у меня имеется, найти инфу о формате autocada - вообще не проблема.

Дело в том что распознование битмапа будет всегда производися с погрешностью, а первый этап поставленной задачи, фактически и будет превращение растра в векторное представление Т.е будет производится двойная работа. Вначале редактор линии превратит в точки затем, наша программа буден по точкам востанавливать линнии - это оправдано когда изображения даются от изначально растрового источника (фотоаппарата, сканера и т.д.). Чертежи вообще принято хранить в векторном формате, тогда их легче редактировать, масштабировать и поворачивать. По меньшей мере будет нелогично хранить битмап если можно *.wmf.

Так ради справки покажу как работать с битмапом.
Объявляются такие структуры
Код

  TRGB = packed Record
           b,g,r : byte;
         end;

  Line = array[0..32768] of TRGB;
  pLine = ^Line;
  
var
  mask1 : array of pLine;


Конвертируем растр из DDB в DIB

Код

  image1.Picture.Bitmap.PixelFormat := pf24bit;


Устанавливаем размеры битмапа(если не загружен)
Код

  image1.Picture.Bitmap.Width  := image1.ClientWidth;
  image1.Picture.Bitmap.Height := image1.ClientHeight;


Выделяем память под массив указателей
Код

  SetLength(mask1, Image1.Picture.Bitmap.Height);


Заполняем масив указателей реальными указателями адресов строк изображения
Код

  For i := 0 to Image1.Picture.Bitmap.Height - 1
  do
    mask1[i] := Image1.Picture.Bitmap.ScanLine[i];


закрашиваем первый пиксель например красным цветом
Код

       mask1[0,0].b := 0;
       mask1[0,0].g := 0;
       mask1[0,0].r := 255;


или читаем (color1 := RGB(mask1[0,0].r, mask1[0,0].g, mask1[0,0].b))
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 18.4.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



alexeis1, спасибо за справку по битмапу. 

Цитата

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


Из-за чего будет погрешность?

Цитата

...это оправдано когда изображения даются от изначально растрового источника (фотоаппарата, сканера и т.д.)


Дело в том, что изображение может быть получено из сканера.

Непонятно, зачем нам первый пиксель закрашивать красным цветом? 

Дальше, на сколько я понимаю, для выделения объектов из рисунка необходимо пробежаться по всему массиву с проверкой цвета соседних элементов? Хотя если, например два прямоугольника имеют общую границу, то это будет сделать трудно. 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
former
Дата 18.4.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



Создал, для начала, картинку (w-200 п, h-100 п) с незакрашенным прямоугольником, загрузил её в Image и попытылся прочитать. Так же создал таблицу StringGrid c размером ячейки (3х3п) и колличеством ячеек, как и у картинки. Следующим шагом попытался заакрасить ячейки таким же цветом как на картинки, т.е. перенести попиксельно картику в таблицу, но:

Цитата

или читаем (color1 := RGB(mask1[0,0].r, mask1[0,0].g, mask1[0,0].b))


а 

Цитата

mask1[i] := Image1.Picture.Bitmap.ScanLine[i];


  smile  


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 20.4.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(former @  18.4.2006,  16:29 Найти цитируемый пост)
Непонятно, зачем нам первый пиксель закрашивать красным цветом?

Это для примера пусть не первый, а любой, и цвет можно выбирать любой smile 

Цитата(former @  18.4.2006,  16:29 Найти цитируемый пост)
Дело в том, что изображение может быть получено из сканера.


Если так, то лучше воспользоваться готовой программой для перевода из растровой графики в векторную графику, на torry.net я скачивал подобную.
Очень советую использовать чужую програму, потому что операция перевода из картинки в линии достаточно сложная.

Добавлено @ 14:06 
вот ссылка на програму 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
former
Дата 20.4.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: нет
Всего: 17



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

Не хочу зависеть от Autocad-а, поэтому dwg отпадает, а вот использовать wmf или emf похоже придётся. 


alexeis1, не могли бы вы привести пример чтения объектов из wmf или emf и поделиться его описанием? 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Alexeis
Дата 21.4.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Вот ссылочки
http://www.wotsit.org/search.asp?page=10&s=graphics
http://wvware.sourceforge.net/libwmf.html
http://www.fileformat.info/format/wmf/

а вообще в делфи есть класс TMetaFile но он не самый удачный я думаю на torry.net есть лучше компоненты 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.