|
|
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, извините, что обращаюсь, но правда не знаю как сделать....вроде на вид все просто....но никак. Не удобно обращаться с "0", но я даже не знаю с чего начать, короче задача такая: "Распознавание образов. Выделение контура". Т.е., например, рисуем черный квадрат, после нажатия кнопки старт должен остаться только его контур. Заранее спасибо. Пишите на мыло lizik@itcwin.com или на асю 163507500 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 15:11 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
liza23Здравствуйте, извините, что обращаюсь, но правда не знаю как сделать....вроде на вид все просто....но никак. Не удобно обращаться с "0", но я даже не знаю с чего начать, короче задача такая: "Распознавание образов. Выделение контура". Т.е., например, рисуем черный квадрат, после нажатия кнопки старт должен остаться только его контур. Заранее спасибо. Пишите на мыло lizik@itcwin.com или на асю 163507500 А на чем надо реализовывать? В какой среде? Есть ли хотя бы какие нибудь наметки камими методами это надо сделать? Если это дипломный проект, то могут потребовать реализовать и через нейронные сети, а если же нет, то алгоритмы могут быть и попроще. Напишите, более конкретные условия выполнения данной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 15:35 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
liza23 ....но никак ..Распознавание образов. Действительно... никак. Потому-что этой демой занимаются целые исследовательские институты и пишут большие и толстые диссертации. И вот так вот... на пальцах вряд-ли кто-то обьяснит принцип. Особенно в форуме, посвященном клиент-серверным технологиям. ..Выделение контура.. Хм... а эта постановка намного проще. Выделение контура - стандарнтый фильтр многих графическиех редакторов. Поищите в интернете на тему "растровые фильтры". И вообще. Определитесь с постановкой. Что вам нужно. Просто выделить контур? Или определить класс геометрической фигуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 15:40 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
А на чем надо реализовывать? В какой среде? Есть ли хотя бы какие нибудь наметки камими методами это надо сделать? Если это дипломный проект, то могут потребовать реализовать и через нейронные сети, а если же нет, то алгоритмы могут быть и попроще. Напишите, более конкретные условия выполнения данной задачи.[/quot] просто в среде С++, все, что было сказано, еще преподаватель сказал, что программа займет всего 5 строчек, так, что я думаю..это самое простое, что может быть..... P.S.-это не диплом...просто курсовик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 16:42 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
И вообще. Определитесь с постановкой. Что вам нужно. Просто выделить контур? Или определить класс геометрической фигуры? просто выделить контур ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 16:44 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
Распознать - значит узнать. Узнать является ли нечто контуром. Для этого нудны признаки. Что является признаком контура - его замкнутость. В простейшем виде (как видимо и хотел препод) нужно по отношению к предъявленной фигуре сделать вывод является лиьона контуром, т.е. замкнута ли она, т.е. да или нет. А здесь естественно будет работать конструкция if(условие) MessageBox("контур"); else MessageBox('не контур'); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 21:00 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
Задача стоит в "Выделение контура" Если мне не изминяет память, попробуйте применить на изображение маску примерно такого вида 0 -1 0 -1 3 -1 0 -1 0 Сам алгоритм сточек 5 займет как раз займет + почитать картинку + вывод на экран А вообще можно залезть в Гугл и там поискать "Edge Detection" "Выделение контура"в ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 21:54 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
Vidmak А вообще можно залезть в Гугл и там поискать "Edge Detection" "Выделение контура"в Пока что непонятно, что ей задали. То ли отфильтровать, то ли распознать. Задачки ведь разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2007, 23:44 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
[/quot] Пока что непонятно, что ей задали. То ли отфильтровать, то ли распознать. Задачки ведь разные.[/quot] ....распознать, т.к. задача звучит как Распознавание образов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2007, 16:00 |
|
||
|
очень срочно и очень нужно
|
|||
|---|---|---|---|
|
#18+
Наверное, все вы знаете известный алгоритм "жука", (извините за глупость), но может просто сократить его? Вот он: Файл заголовка: //--------------------------------------------------------------------------- #ifndef GraphicUnitH #define GraphicUnitH //--------------------------------------------------------------------------- #include <Graphics.hpp> extern void AlgorithmBeatle(Graphics::TBitmap* FromImage, Graphics::TBitmap* ToImage); extern void AlgorithmScan(Graphics::TBitmap* FromImage, Graphics::TBitmap* ToImage); #endif cpp файл: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "GraphicUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #include <Sysutils.hpp> /* Отслеживающий алгоритм выделения контуров "Алгоритм жука" */ void AlgorithmBeatle(Graphics::TBitmap* FromImage, Graphics::TBitmap* ToImage) { typedef enum {North, East, South, West} TDirectional; int X,Y; // Координаты первой встречи с объектом int cX,cY; // Текущие координаты маркера Byte *Line, *ToLine; // Обрабатываемые линии Byte B; // Значение текущего пиксела TDirectional Direct; // Направление движения жука // Идем до тех пор, пока не встретим черную область for (Y = 0; Y < FromImage->Height; Y++) { Line = (Byte*)FromImage->ScanLine[Y]; for (X = 0; X < FromImage->Width; X++) { B = Line[X]; if (B < 255) break; } // Если встречен объект, отличающийся от цвета фона (255 - белый) // прервать поиск if (X != FromImage->Width) break; } // Если не нашли ни одного черного пиксела, то выходим из процедуры if ((X == FromImage->Width) && (Y == FromImage->Height)) return; // Если все нормально, начинаем обход по алгоритму жука ToLine = (Byte*)ToImage->ScanLine[Y]; ToLine[X] = 0; // Поворачиваем налево (новое направление - север) cX = X; cY = Y - 1; Direct = North; Line = (Byte*)FromImage->ScanLine[cY]; // Пока не придем в исходную точку, выделяем контур объекта while ((cX != X) || (cY != Y)) { // В зависимости от текущего направления движения жука switch (Direct) { // Север case North: { B = Line[cX]; // Если элемент "черный", поворачиваем снова "налево" if (B < 255) { ToLine = (Byte*)ToImage->ScanLine[cY]; ToLine[cX] = 0; Direct = West; cX--; } // Иначе поворачиваем "направо" else { Direct = East; cX++; } } break; // Восток case East: { B = Line[cX]; // Если элемент "черный", поворачиваем снова "налево" if (B < 255) { ToLine = (Byte*)ToImage->ScanLine[cY]; ToLine[cX] = 0; Direct = North; cY--; Line = (Byte*)FromImage->ScanLine[cY]; } // Иначе поворачиваем "направо" else { Direct = South; cY++; Line = (Byte*)FromImage->ScanLine[cY]; } } break; // Юг case South: { B = Line[cX]; // Если элемент "черный", поворачиваем снова "налево" if (B < 255) { ToLine = (Byte*)ToImage->ScanLine[cY]; ToLine[cX] = 0; Direct = East; cX++; } // Иначе поворачиваем "направо" else { Direct = West; cX--; } } break; // Запад case West: { B = Line[cX]; // Если элемент "черный", поворачиваем снова "налево" if (B < 255) { ToLine = (Byte*)ToImage->ScanLine[cY]; ToLine[cX] = 0; Direct = South; cY++; Line = (Byte*)FromImage->ScanLine[cY]; } // Иначе поворачиваем "направо" else { Direct = North; cY--; Line = (Byte*)FromImage->ScanLine[cY]; } } } } } // --------------------------------------------------------------------------- void AlgorithmScan(Graphics::TBitmap* FromImage, Graphics::TBitmap* ToImage) { // Тип ветви (левая или правая) typedef enum {bLeft, bRight} TBranchType; // Структура, описывающая ветвь struct TBranch { TBranchType BranchType; // Тип ветви TBranch* Branch; // Парная ветвь }; // Структура, описывающая строку struct TString { int BeginX; // Начало черной серии int EndX; // Конец черной серии TBranch* Branch; // Указатель на структуру ветви }; // Возможные ситуации typedef enum { sBegin, // Начало sNext, // Продолжение sBranch, // Ветвление sFusion, // Слияние sEnd // Конец } TSituation; // Сканируемая полоса struct TLine { Byte* L1; // Верхняя линия Byte* L2; // Нижняя линия }; int Y; // Текущая координата Y int X; // Текущая координата X int cX; // Временная координата X для сканирования TLine Line; // Сканируемая полоса TSituation CurrentSituation; // Текущая ситуация for (Y = 0; Y < FromImage->Height; Y++) { Line.L1 = (Byte*)FromImage->ScanLine[Y]; Y++; Line.L2 = (Byte*)FromImage->ScanLine[Y]; // Пробуем выявить ситуации: // Ищем первый черный элемент во второй линии сканируемой полосы for (X = 0; X < FromImage->Width; X++) { if (Line.L2[X] < 255) { // Если черный элемент найден, пытаемся уточнить ситуацию CurrentSituation = sBegin; for (cX = X; cX < FromImage->Width; cX++) { } } } } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2007, 16:22 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34240261&tid=2029706]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
164ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 458ms |

| 0 / 0 |
