Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 1

Низкочастотная фильтрация изображений (книга Гонсалеса “Цифровая обработка изображений”)

08.02.2016, 02:14. Показов 3761. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Я пытаюсь реализовать на java низкочастотную фильтрацию изображений.

Реализую по книге Гонсалеса "Цифровая обработка изображений" следущие пункты (стр. 245):
"1) Исходное изображение умножается на "(-1)^(x+y)", чтобы его фурье-преобразование оказалось центрированным;
2) Вычисляется прямое ДПФ F(u,v) изображения, полученного после шага 1;
3) Ф-ция F(u,v) умножается на ф-цию фильтра H(u,v);
4) Вычисляется обратное ДПФ от результата шага 3;
5) Вычисляется вещественная часть результата шага 4;
6) Результат шага 5 умножается на (-1)^(x+y)"

Чисто для примера, решила реализовать "Идеальный фильтр низких частот" (стр.257). Как я понимаю, результат получается неправельным с самого первого шага. Подскажите, пожалуйста, что я делаю не так. Прикладываю код каждого шага и результаты обработки на каждом шаге.

Моя реализация шагов:

1)

Java Скопировано
1
2
3
4
5
6
7
8
9
double funcXY;
Complex[][] arrOnStepOne = new Complex[bufferedImage.getWidth()][bufferedImage.getHeight()];
for (int x = 0; x < bufferedImage.getWidth(); x++) {
    for (int y = 0; y < bufferedImage.getHeight(); y++) {
        funcXY = (Math.pow(-1.0, (x + y))) * bufferedImage.getRGB(x, y);
        Complex complexFuncXY = new Complex(funcXY, 0);
        arrOnStepOne[x][y] = complexFuncXY;
    }
}
2)

Java Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int width = arrOnStepOne.length;
int height = arrOnStepOne[0].length;
Complex sumByX = new Complex(0, 0);
Complex sumByY = new Complex(0, 0);
Complex[][] complexFurje = new Complex[width][height];
for (int u=0; u <= width-1; u++) {
    for (int v = 0; v <= height-1; v++) {
        sumByX = new Complex(0, 0);
        for (int x = 0; x <= width - 1; x++) {
            sumByY = new Complex(0, 0);
            for (int y = 0; y <= height - 1; y++) {
                Double teta = -2 * Math.PI * ((u * x / (double) width) + (v * y / (double) height));
                Complex complexE = new Complex(Math.cos(teta), Math.sin(teta));
                sumByY = sumByY.Add(arrOnStepOne[x][y].Mult(complexE));
            }
            sumByX = sumByX.Add(sumByY);
        }
        complexFurje[u][v] = sumByX.Div(new Complex(width*height, 0));
    }
}
3)

Java Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int d0;
int nPow = 2;
double d;
double filtrD;
double filtrH;
Complex[][] complexFiltr = new Complex[width][height];
 
for (int u=0;u <= width-1; u++) {
    for (int v = 0; v <= height-1; v++) {
        d = Math.pow((u - width / 2.), 2) + Math.pow((v - height / 2.), 2);
        filtrD = Math.pow(d, 1. / 2); //D(u,v)
        d0 = 80;
        filtrH = 1 / (1 + Math.pow(filtrD / d0, 2. * nPow));
        complexFiltr[u][v] = new Complex(filtrH, 0).Mult(complexFurje[u][v]);
    }
}
4)

Java Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int x = 0; x <= width-1 ; x++) {
    System.out.println("X = " + x +" / " + (width-1) + ".");
    for (int y = 0; y <= height-1 ; y++) {
        sumByU = new Complex(0, 0);
 
        for (int u = 0; u <= width-1; u++) {
            sumByV = new Complex(0, 0);
            for (int v = 0; v <= height - 1; v++) {
                Double teta = 2 * Math.PI * (x * u / (double) width + y * v / (double) height);
                Complex complexE = new Complex(Math.cos(teta), Math.sin(teta));
                sumByV = sumByV.Add(complexE.Mult(complexFiltr[u][v]));
            }
            sumByU = sumByU.Add(sumByV);
        }
        funcStep4XY[x][y]=sumByU;
    }
}
5,6)

Java Скопировано
1
2
3
4
5
6
for (int x = 0; x <= width-1; x++) {
    for (int y = 0; y <= height-1; y++) {
        funcStep5XY[x][y] = funcStep4XY[x][y].getdReal();
        funcStep5XY[x][y] *= Math.pow(-1.0,x+y);
    }
}
Подскажите, пожалуйста, что я делаю не так.

Ссылка на книгу:
http://www.ex.ua/746074831618
Миниатюры
Низкочастотная фильтрация изображений (книга Гонсалеса “Цифровая обработка изображений”)  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2016, 02:14
Ответы с готовыми решениями:

Обработка изображений
Здравствуйте, помогите пожалуйста написать алгоритм для определения теней на фото,заранее спасибо)

Обработка изображений
Помогите, пожалуиста, рещить следуюшую задачу. Есть набор картинок(50 фото или больше. Это фотографии однои и тои же вещи(чипа), снятои с...

Обработка изображений - что делать с зернистостью?
Есть лабораторные микроснимки печатающей головки для принтера, на которых надо сделать регистрацию или что-то в этом роде (распознавание и...

2
Модератор
Эксперт функциональных языков программирования
3087 / 2236 / 466
Регистрация: 26.03.2015
Сообщений: 8,768
08.02.2016, 09:57
Цитата Сообщение от Helena007 Посмотреть сообщение
bufferedImage.getRGB(x, y)
У Вас чёрно-белое изображение, то есть, для всех точек R == G == B. Вам нужна функция яркости. Предполагаю, что нужно взять одну! любую из этих компонент. При обратном преобразовании создадите пиксель с одинаковыми значениями R,G,B.

Добавлено через 1 минуту
Предположу, что где-то в начале книги должно быть написано, как именно получать f(x,y) из пикселя.
1
 Аватар для A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
01.04.2016, 08:10
Helena007, я тоже собираюсь что-нибудь отфильтровать
Моя тема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2016, 08:10
Помогаю со студенческими работами здесь

Цифровая обработка изображений
Основы цифровой обработки изображений на языке С# Создаем приложение WindowsForms (язык программирования C#). На форму помещаем...

Цифровая обработка сигналов и изображений
Здравстуйте!!! Подскажите какие можно использовать компоненты и алгоритмы, чтобы создать программу цифровой обработки сигналов и...

Цифровая обработка изображений на Java
Здравствуйте! Может быть кто-нибудь здесь занимается цифровой обработкой изображений? Бинаризирую в проге на Java вот такое изображение...

Цифровая обработка изображений (работа с пикселями)
Доброго времени суток) Подскажите, как в С# описывается алгоритм поиска количества пикселей одного цвета (допустим синего) на...

Обработка изображений. Изменение размеров изображений
Подскажите пожалуйста, как изменить размер изображения в MathCad. Какой код нужен для уменьшения/увеличения изображения?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер