Помогите реализовать преобразование по след. алгоритму:
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;
}