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

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

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

Здравствуйте.
Я пытаюсь реализовать на 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
Миниатюры
Низкочастотная фильтрация изображений (книга Гонсалеса “Цифровая обработка изображений”)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2016, 02:14
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 1 минуту
Предположу, что где-то в начале книги должно быть написано, как именно получать f(x,y) из пикселя.
1
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
01.04.2016, 08:10 3
Helena007, я тоже собираюсь что-нибудь отфильтровать
Моя тема.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2016, 08:10

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.