Перейти к содержимому
Compvision.ru
Adept88

cvDFT

Recommended Posts

Помогите реализовать преобразование по след. алгоритму:

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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что могу сказать, так это, то что Вы умножаете беззнаковые данные на -1.

Это точно то, чего Вы хотите?

И еще, при применении фильтров в частотном диапазоне надо либо переставлять четверти полученного преобразования, либо учесть это при формировании фильтра.

Посмотрите здесь: http://www.compvision.ru/forum/index.php?showtopic=360

я делал фильтр в частотном диапазоне, может его взять за основу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Переделаю во float.

Спасибо за ссылку, но не могу оттуда вычленить нужный материал.

Вы не могли бы показать, как взять IplImage, применить на его пикселах БПФ, а потом ОПФ?

Я читал, что БПФ реализуется в cvDFT, но вот применить к IplImage не выходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю, это должно подойти:

http://www.compvision.ru/forum/index.php?showtopic=110

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×