|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Aliaksandr Kuznetsou 2:450/42.174 07 Apr 2003 15:58:52 To : Alexey Volkov Subject : Корреляционные алгоритмы -------------------------------------------------------------------------------- До меня дошло, что 07 Apr 03 в 15:31, Вы писали мне, и вот что я думаю: AK>> В функции сравнения можно поворачивать "искомое" изображение AK>> (если я не ошибаюсь для этого юзалась матрица поворота), заменяя AK>> "пустые" пиксели флагом, который не будет учитываться при AK>> сравнении. Для поворота нам понадобится матрица ((w^2 + h^2)^0.5) AK>> и размещение искомого изображения ровно по центру этогог AK>> изображения. Hу а потом как описано выше, только с учётом флага AK>> "пустоты". AV> А какой-нибудь конкретный пример можно? Хез - сырцы если и есть, то дома, посмотрю, но там только для определения "правильности" контуров (т.е. сами цвета не учитываются). AV> Hе совсем я понимаю как это сравнение будет происходить. Сейчас в AV> моем AV> сознаний приблизительно следующая картина: AV> 1) Делаем оба изображения монохромными (Только зачем? Ведь при AV> этом может быть утерена какая-то существенная информация и AV> подизображение сможет быть унифицированно с более чем одним участком AV> исходного. Кстати стоит заметить что соотношение исходного изображения AV> и подизображения может быть очень значительным, например 1 000 000 : AV> 1, а то и больше. И это при том, что подизображение имеет разрешение AV> приблизительно 500x500.) Для более лёгкого сравнения и учёта отклонений (естесственно теряется точность). Если надо очень надёжно, то можно ничего и не понижать (как я уже говорил, я юзал этот аглоритм только для определения "правильности контуров", а не для определения "правильности всего изображения") AV> 2) Далее как бы двигаем подизображение по исходному сравнивая AV> участок исходного, на который наложено подизображение с этим AV> подизображением. Получаем какую-то оценку полученного сравнения. AV> (Каков вид этой оценочной функции?) AV> 3) Пройдя таким образом все исходное изображение, поворачиваем AV> подизображение, допустим на один градус, и повторяем предыдущий шаг AV> (2). Примерно так: int compare(int deltaX, int deltaY) { int res[360]; for (int i=0;i<360;i++) { Rotate(&src_img,&dest_img,i); for (int y = 0;y<dest_img.width;y++) for (int x = 0;y<dest_img.heght;x++) res[i]+= abs(dest_img.bmp[y*dest_img.width + x] - full_img.bmp[(y+deltaY)*full_img.width + (x + deltaX)]); return наименьшее_из_res; } Массив res будет содержать отклонения самые маленькие из которых - самые похожие повороты. Т.е. заводим ещё 3 переменные (minX,minY,minD) в которые будем ложить x (в minX) и y (minY) для наменьшего res из всего массива, если оно меньше того что уже лежит там (в minD). Т.е. int tASSt() { int deltaX,deltaY,minX,minY; unsigned int minD = 65535; for (deltaY = 0;deltaY<full_img.width;deltaY++) for (deltaX=0;deltaX<full_img.height;deltaX++) { int res = compare(deltaX,deltaY); if (res<minD) { minD = res; minX = deltaX; minY = deltaY; } } return (minD<минимальный_допуск); } теперь в minD - наименьшее отклонение (minX,minY - его координаты), если надо можно и угол запомнить, но тебе если я не ошибся надо только содержится или нет. Оптимизировать можно до потери пульса, но из "теории" - всё. =) return "Bye!"; // #_ЬЬЬЬЬ_# } // ЯЯЯЯЯ --- и тишина... * Origin: Да здравствует Windows! Бил Гейца в президенты РБ! (2:450/42.174) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33413e917e73.html, оценка из 5, голосов 10
|