سؤال

لدي مهمة حول fftw وكانت أحاول كتابة برنامج صغير لإنشاء fft من صورة. أنا أستخدم CIMG لقراءة الصور وكتابةها. ولكن كل ما أحصل عليه هو صورة مظلمة مع نقطة واحدة بيضاء :(

من المرجح أن أقوم بهذه الطريقة الخطأ وأود أن أقدر ما إذا كان شخص ما يمكن أن يفسر كيف ينبغي القيام بذلك. لا أحتاج إلى الكود، أريد فقط معرفة ما هو الطريقة الصحيحة للقيام بذلك.

هنا هو رمزي:

CImg<double> input("test3.bmp");
CImg<double> image_fft(input, false);

unsigned int nx = input.dimx(), ny = input.dimy();
size_t align = sizeof(Complex);

array2<Complex> in (nx, ny, align);

fft2d Forward(-1, in);

for (int i = 0; i < input.dimx(); ++i) {
    for (int j = 0; j < input.dimy(); ++j) {
        in(i,j) = input(i,j);
    }
}

Forward.fft(in);

for (int i = 0; i < input.dimx(); ++i) {
    for (int j = 0; j < input.dimy(); ++j) {
        image_fft(i,j,0) = image_fft(i,j,1) = image_fft(i,j,2) = std::abs(in(i,j));
    }
}

image_fft.normalize(0, 255);
image_fft.save("test.bmp");
هل كانت مفيدة؟

المحلول

تحتاج إلى الحصول على سجل الحجم. النقطة البيضاء الفردية هي القيمة الأساسية (0 هرتز، العاصمة، مهما كنت تريد أن تسميها)، لذلك سيكون دائما أكبر من أكبر عنصر في أي صورة تتناولها (نظرا لأن قيم البكسل لا يمكن أن تكون سلبية، فستكون قيمة DC دائما تكون إيجابية وكبيرة).

ما عليك القيام به هو حساب السجل (LN، مهما كان، نوع من حساب لوغاريتمي) من الحجم (هكذا بعد تحويله من نموذج معقد إلى حجم / مرحلة (PHASOR IIRC IIRC؟)) في كل نقطة قبل التطبيع هو - هي.

يرجى ملاحظة أن القيم موجودة، فهي صغيرة حقا مقارنة بقيمة DC، وإذ تلبي السجل (مما يجعل القيم الأصغر أكبر بكثير، وأكبر قيم أكبر قليلا فقط) سيجعل الترددات الأخرى مرئية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top