ProgRoman 9 Жалоба Опубликовано November 6, 2012 В примерах opencv есть реализация фильтра Габора, ниже привел код Mat getGaborKernel( Size ksize, double sigma, double theta, double lambd, double gamma, double psi, int ktype ) { double sigma_x = sigma; double sigma_y = sigma/gamma; int nstds = 3; int xmin, xmax, ymin, ymax; double c = cos(theta), s = sin(theta); if( ksize.width > 0 ) xmax = ksize.width/2; else xmax = cvRound(std::max(fabs(nstds*sigma_x*c), fabs(nstds*sigma_y*s))); if( ksize.height > 0 ) ymax = ksize.height/2; else ymax = cvRound(std::max(fabs(nstds*sigma_x*s), fabs(nstds*sigma_y*c))); xmin = -xmax; ymin = -ymax; CV_Assert( ktype == CV_32F || ktype == CV_64F ); Mat kernel(ymax - ymin + 1, xmax - xmin + 1, ktype); double scale = 1/(2*CV_PI*sigma_x*sigma_y); double ex = -0.5/(sigma_x*sigma_x); double ey = -0.5/(sigma_y*sigma_y); double cscale = CV_PI*2/lambd; for( int y = ymin; y <= ymax; y++ ) for( int x = xmin; x <= xmax; x++ ) { double xr = x*c + y*s; double yr = -x*s + y*c; double v = scale*exp(ex*xr*xr + ey*yr*yr)*cos(cscale*xr + psi); if( ktype == CV_32F ) kernel.at<float>(ymax - y, xmax - x) = (float)v; else kernel.at<double>(ymax - y, xmax - x) = v; } return kernel; } у меня почему то результат работы фильтра очень бледный порой вообще практически не заметное изображение, вызываю фильтр таким образом cv::Mat image = cv::imread("E:/Projects/ComputerVision/Data bases/faces/test/image_0450.jpg",1); cv::imshow("Src", image); cv::Mat src; cv::cvtColor(image, src, CV_BGR2GRAY); src.convertTo(src_f, CV_64F, 1.0/255, 0); Mat res_f = getGaborKernel(Size(25,25),15,100,30,50,5); Mat dst; filter2D(src_f,dst,CV_32F,res_f); imshow("res",dst); пытался менять параметры пока ничего нормального не нашёл результат фильтра практически не виден dst порой совсем чёрная. Пока пытаюсь всё ещё менять параметры смотрю как меняется изображение. Может кто знает сталкивался с такой проблемой... возможно я какой-то параметр не совсем корректно задаю... ниже прикреплены два изображения одно оригинальное другое после обработки фильтром И мне не совсем ясно каким образом фильтр габора можно использовать в распознавании... Имеем оригинальное изображение, затем после обработки фильтром получаем новое обработанное.. и что дальше каким образом использовать это обработанное отфильтрованное изображение... вообще по идее как я понимаю.. мы должны бы к изображению применить фильтры под разным углом(с различным theta) при различном theta отфильтрованное изображение меняется.. но как это всё применять не ясно может быть кто-то занимался этим Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 6, 2012 Видимо что-то родственное этой теме: http://www.compvision.ru/forum/index.php?showtopic=894 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано November 7, 2012 вот посмотрите http://www.compvision.ru/forum/index.php?showtopic=861&view=findpost&p=7236 ,я использовал фильтр Габора который выкладывал Smorodov и прикрутил к нему SVM. я пробовал для поиска ключевых точек, смысл в том что мы применяем N фильтров габора под разными углами и разными масштабами для всего изображения, потом выделяем точки для обучения(берем вокруг них небольшую окрестность) получаем вектор-дескриптор, потом его суём в классификатор, теортетически так можно найти например уголки губ.(не знаю возможно можно как то можно считать только для точек, а не для всего изображения, а то получается жирно) так же можно просто использовать целиком для рамки лица для всех пикселей как дескриптор. но тут мы имеем проблему со скейлом как всегда. а вообще этот код можно использовать и для нахождения текстур например. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано November 8, 2012 вот еще документ http://www.doc.ic.ac.uk/~mvalstar/Documents/VukadinovicPantic-SMC05-FINAL.pdf Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах