Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2016, 11:48   #1
triest
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 30
По умолчанию Фурье спектр изображения

Необходимо сделать фурье преобразование изображения. Вначале прохожу по строкам, затем по столбцам промежуточного результата.

Для одномерного массива:
Код:
For j:=0 to M-1 do begin
For i:=0 to M-1 do begin
f_x_Re[j]:=f_x_Re[j]+Re[i]*cos((2*Pi*i*j)/M);
f_x_Im[j]:=f_x_Im[j]+Im[i]*sin((2*Pi*i*j)/M);
end;
end;
Для двухмерного

забираем пиксели в массив
Код:
 for i:=0 to Hi-1 do  //по строкам
    begin
    for j:=0 to Wi-1 do   //столбцам
      begin
        fxy[i,j] :=image.Canvas.Pixels[j,i];     //
         fxy[i,j] :=fxy[i,j]*power(-1,i+j); //    умножаем на -1 в степени i+j
    end;
Сначала делаю преобразования по строкам
//первое число массива строка
// второе столбец

Код:
  for i:=0 to Hi-1 do
        begin
            for j:=0 to Wi-1 do
              begin
                  for k:=0 to Wi-1 do
                    begin
                       fxv_re[i,j]:=fxv_re[i,j]+round(fxy[i,k]*cos((2*pi*j*k)/Wi));
                       fxv_im[i,j]:=fxv_im[i,j]+round(fxy[i,k]*sin((2*pi*j*k)/Wi));
                    end;
              end;
        end;

Затем по слолбцам промежуточного результата, но с учетом комплексной части
Код:
 for j:=0 to Wi-1 do
    begin
      for i:=0 to Hi-1 do
        begin
          for k:=0 to Hi-1 do
            begin
                fuv_re[i,j]:=fuv_re[i,j]+fxv_re[k,j]*cos((2*pi*i*k)/Hi)+fxv_im[k,j]*sin((2*pi*j*k)/Hi);
                fuv_im[i,j]:=fuv_im[i,j]+fxv_re[k,j]*sin((2*pi*i*k)/Hi)-fxv_im[k,j]*cos((2*pi*j*k)/Hi);
            end;
        end
    end;

Затем выделяю действительную часть по формуле Эйлера.

Код:
        for i:=0 to Hi-1 do
        begin
            for j:=0 to Wi-1 do
              begin
                fuv[i,j]:=sqrt(sqr(fuv_re[i,j])+sqr(fuv_im[i,j]));
              end;
        end;
Выводим результат

Код:
form8.visible:=true;
  for i:=0 to Hi-1 do  //
    begin
    for j:=0 to Wi-1 do   //
      begin
      form8.image1.Canvas.Pixels[j,i]:=round(fuv[i,j]);   //выводим результат
      end;
    end;
Но вот результат не совпадает с тем. что предполагается (онлайн преобразование)
http://www.ejectamenta.com/Imaging-E...filtering.html
Код функции, Spectr, запускающейся при нажатии кнопки "прямое гауса" (Unut1).

Полный проект.
http://file.sampo.ru/dw2rvv/

Где ошибка?
Код:
procedure FilterSetupClass.Spectr (image: TImage);
var
  i,j,u,v,x,y,M,N,pixeli,pixelj ,t,p,k,z,Height,Width,sizex,sizey,Wi,Hi:integer;
  pwr,D,H,H1,H2: real;
  summa:Longint;
  tempr, tempg, tempb, ftemp: extended;
  filteredPixel: TColor;
  fxy, fuv, fuv_im, fuv_re, fxv, fxv_re, fxv_im: array of array of real;
 const nn=3;
begin

 SetLength(fxy, image.Height);    //массив предварительной обработки ?
  SetLength(fuv, image.Height);    //массив преобразования фурье
  SetLength(fuv_re, image.Height);  //массив действительной части
  SetLength(fuv_im, image.Height);  //массив мнимой части
  SetLength(fxv, image.Height);
  SetLength(fxv_re, image.Height);
  SetLength(fxv_im, image.Height);
  for i:=0 to image.Height-1 do
  begin
    SetLength(fxy[i], image.Width);
    SetLength(fuv[i], image.Width);
    SetLength(fuv_re[i], image.Width);
    SetLength(fuv_im[i], image.Width);
    SetLength(fxv[i], image.Width);
    SetLength(fxv_re[i], image.Width);
    SetLength(fxv_im[i], image.Width);
  end;


  for i:=0 to image.Height-1 do
    begin
         SetLength(fxy[i], image.Width);
    end;

    sizex:=image.height;
    Hi:=image.height;
    sizey:=image.Width;
    Wi:=image.Width;

    // умножаем изображение на -1 в степени x+y
   for i:=0 to Hi-1 do  //высота
    begin
    for j:=0 to Wi-1 do   //ширина
      begin
        fxy[i,j] :=image.Canvas.Pixels[j,i];     //забираем пиксели в массив
         fxy[i,j] :=fxy[i,j]*power(-1,i+j); //    умножаем функцию на -1 в степени 3}
      end;
    end;



    //первое число массива-строка, второе-столбец
     // по стокам

      for i:=0 to Hi-1 do
        begin
            for j:=0 to Wi-1 do
              begin
                  for k:=0 to Wi-1 do
                    begin
                       fxv_re[i,j]:=fxv_re[i,j]+round(fxy[i,k]*cos((2*pi*j*k)/Wi));
                       fxv_im[i,j]:=fxv_im[i,j]+round(fxy[i,k]*sin((2*pi*j*k)/Wi));
                    end;
              end;
        end;
    //

  // по столбцам

  for j:=0 to Wi-1 do
    begin
      for i:=0 to Hi-1 do
        begin
          for k:=0 to Hi-1 do
            begin
                fuv_re[i,j]:=fuv_re[i,j]+fxv_re[k,j]*cos((2*pi*i*k)/Hi)+fxv_im[k,j]*sin((2*pi*j*k)/Hi);
                fuv_im[i,j]:=fuv_im[i,j]+fxv_re[k,j]*sin((2*pi*i*k)/Hi)-fxv_im[k,j]*cos((2*pi*j*k)/Hi);
            end;
        end
    end;

      //  выделяем действ часть
        for i:=0 to Hi-1 do
        begin
            for j:=0 to Wi-1 do
              begin
                fuv[i,j]:=sqrt(sqr(fuv_re[i,j])+sqr(fuv_im[i,j]));
              end;
        end;

       form8.visible:=true;
  for i:=0 to Hi-1 do  //высота
    begin
    for j:=0 to Wi-1 do   //ширина
      begin
      form8.image1.Canvas.Pixels[j,i]:=round(fuv[i,j]);   //выводим результат в форму 8
      end;
    end;
   //   Form7.Visible:=true;
  
end;

Последний раз редактировалось triest; 29.03.2016 в 11:53.
triest вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка изображения преобразование Фурье Ria Alva C++ Builder 0 06.06.2012 21:43
C++ Builder обработка изображения преобразование Фурье Ria Alva Помощь студентам 0 05.06.2012 20:31
Музыкальный спектр Fiery Fox C# (си шарп) 5 14.06.2011 12:54
Спектр сигнала Zer0 Помощь студентам 6 01.05.2011 22:27
БПФ спектр Voxa7 Помощь студентам 3 18.04.2011 14:16