Как реализовать 1D БПФ фильтр для каждой горизонтальной линии данных из изображения - PullRequest
2 голосов
/ 06 июля 2010

Я хочу применить фильтр частотной области, такой как Низкочастотный или Полосный, к каждой горизонтальной линии изображения. Возможно ли это с помощью opencv?

Ответы [ 2 ]

5 голосов
/ 06 июля 2010

Я думаю, что вам нужно будет более подробно остановиться на ваших вопросах. Возможно, приведу несколько конкретных примеров.

Если я интерпретирую ваш вопрос как:

У вас есть изображение, скажем, 10 х 10

строка 1

строка 2

строка 3 ...

строка 10

Вы хотите применить какой-либо фильтр (Low Pass / Band Pass) к этим линиям независимо.

Затем, сначала вам нужно спроектировать горизонтальные фильтры (в любом инструменте, который вы хотите).

Предположим (без ограничения общности), что у вас есть 2 фильтра:

Низкочастотный: 1x10 изображение

Полоса пропуск: 1x10 изображение

Затем вы можете использовать cv :: dft для преобразования этих фильтров в частотную область. Также используйте cv :: dft для преобразования вашего изображения в частотную область. Конечно, вы должны конвертировать отдельные строки отдельно. Один из способов сделать это:

cv::Mat im = cv::imread('myimage.jpg', 1);
cv::Mat one_row_in_frequency_domain;
for (int i=0; i<im.rows; i++){
  cv::Mat one_row = im.row(i);
  cv::dft(one_row, one_row_in_frequency_domain);

  // Apply your filter by multiplying
}
2 голосов
/ 06 января 2015

на самом деле похоже, что openCV может сделать это из коробки: см. Здесь в руководстве

DFT_ROWS выполняет прямое или обратное преобразование каждой отдельной строки вводаматрица;Этот флаг позволяет преобразовывать несколько векторов одновременно и может использоваться для уменьшения накладных расходов

...