Adept88 0 Жалоба Опубликовано November 22, 2012 Помогите реализовать преобразование по след. алгоритму: 1) умножаем пиксели на (-1)^(x+y) ( в степени) 2) применяем ДПФ. Вот это хочу реализовать с помощью cvDFT, но не получается 3) применяем некий фильтр (например Баттерворт) 4) применяем ОПФ. также с помощью cvDFT 5) умножаем пиксели на (-1)^(x+y) ( в степени) Вот, что я намудрил: #include <cv.h> #include <highgui.h> #include <cmath> #include <iostream> static int W, H, STEP; void transform(uchar *); int main() { IplImage *clone1, *clone2, *clone3, *image = (cvLoadImage("Image.jpg", 0) ); if (!image) return 1; STEP = image->widthStep; W = image->width; H = image->height; // создадим клонов clone1 = cvCloneImage(image); clone2 = cvCloneImage(image); clone3 = cvCloneImage(image); // покажем изображения cvNamedWindow("original"); cvNamedWindow("ideal filter"); cvNamedWindow("butterworth"); cvNamedWindow("gauss"); // сдвинем их cvMoveWindow("original", 0, 0); cvMoveWindow("ideal filter", 0, H + 60); cvMoveWindow("butterworth", W, 0); cvMoveWindow("gauss", W, H + 60); uchar* ptr = (uchar*) (image->imageData); uchar* ptr1 = (uchar*) (clone1->imageData); uchar* ptr2 = (uchar*) (clone2->imageData); uchar* ptr3 = (uchar*) (clone3->imageData); transform(ptr1); transform(ptr2); transform(ptr3); /*CvMat* mtt = cvCreateMat(W, H, CV_32FC1); mtt->data.ptr = (uchar*) clone1->imageData; //CvMat* dft_A = cvCreateMat( dft_M, dft_N, CV_64FC2 ); cvDFT(mtt, mtt, CV_DXT_FORWARD); */ transform(ptr1); transform(ptr2); transform(ptr3); while(cvWaitKey(33) != 27) { cvShowImage("original", image); cvShowImage("ideal filter", clone1); cvShowImage("butterworth", clone2); cvShowImage("gauss", clone3); } // освобождаем ресурсы cvReleaseImage(&image); cvReleaseImage(&clone1); cvReleaseImage(&clone2); cvReleaseImage(&clone3); // удаляем окна cvDestroyAllWindows(); return 0; } void transform(uchar *ptr) { for(int y=0; y < H; y++) for(int x=0; x < W; x++) if ((x + y) % 2 == 1) ptr[y * STEP + x] *= -1; return; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 22, 2012 Что могу сказать, так это, то что Вы умножаете беззнаковые данные на -1. Это точно то, чего Вы хотите? И еще, при применении фильтров в частотном диапазоне надо либо переставлять четверти полученного преобразования, либо учесть это при формировании фильтра. Посмотрите здесь: http://www.compvision.ru/forum/index.php?showtopic=360 я делал фильтр в частотном диапазоне, может его взять за основу? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Adept88 0 Жалоба Опубликовано November 22, 2012 Переделаю во float. Спасибо за ссылку, но не могу оттуда вычленить нужный материал. Вы не могли бы показать, как взять IplImage, применить на его пикселах БПФ, а потом ОПФ? Я читал, что БПФ реализуется в cvDFT, но вот применить к IplImage не выходит. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 22, 2012 Думаю, это должно подойти: http://www.compvision.ru/forum/index.php?showtopic=110 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах