Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 46

Обратное дискретное косинусное преобразование

07.10.2020, 16:19. Показов 1592. Ответов 11
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
При работе с JPEG понадобилось реализовать ДКП и ОДКП. Возникла проблема, некоторые значения в блоке получаются с искажениями +/- 1. Может что-то не так с кодом? Тестирую на матрице arr

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
        int[][] arr = new int[][]{{24, 24, 23, 22, 21, 20, 20, 20}, {23, 22, 21, 21, 19, 19, 18, 17},
                {24, 22, 20, 20, 20, 19, 18, 16}, {25, 23, 22, 21, 21, 20, 19, 18},
                {24, 24, 23, 22, 22, 21, 20, 19}, {23, 23, 23, 22, 21, 21, 20, 20},
                {22, 22, 21, 21, 20, 20, 20, 19}, {24, 22, 21, 21, 21, 21, 20, 19}};
 
        int[][] dcp = DCP.getDCP(arr);
        for (int i = 0; i < dcp.length; i++){
            for (int j = 0; j < dcp[0].length; j++){
                System.out.print(dcp[i][j] + " ");
            }
            System.out.println("");
        }
 
        int[][] odcp = DCP.getODCP(dcp);
        for (int i = 0; i < odcp.length; i++){
            for (int j = 0; j < odcp[0].length; j++){
                System.out.print(odcp[i][j] + " ");
            }
            System.out.println("");
        }
 
        private static final double[] c = new double[]{0.7071067812, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
        static int[][] getDCP(int[][] colorBloc) {
        int[][] dcp = new int[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                dcp[i][j] = (int) Math.round(0.25 * c[i] * c[j] * DCP(colorBloc, i, j));
            }
        }
        return dcp;
    }
 
    static int[][] getODCP(int[][] colorBloc) {
        int[][] dcp = new int[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                dcp[i][j] = (int) Math.round(ODCP(colorBloc, i, j));
            }
        }
        return dcp;
    }
 
    private static double ODCP(int[][] f, int i, int j) {
       double sum = 0;
 
       for (int x = 0; x < N; x++) {
           for (int y = 0; y < N; y++) {
               sum += 0.25 * f[x][y] * c[x] * c[y] * Math.cos(((2 * i + 1) * x * Math.PI) / (2 * N)) * Math.cos(((2 * j + 1) * y * Math.PI) / (2 * N));
           }
       }
       return sum;
   }
 
    private static double DCP(int[][] f, int i, int j) {
        double sum = 0;
 
        for (int x = 0; x < N; x++) {
            for (int y = 0; y < N; y++) {
                if (i == 0 && j == 0)
                    sum += f[x][y];
                else
                    sum += f[x][y] * Math.cos(((2*x+1)*i*Math.PI)/(2*N)) * Math.cos(((2*y+1)*j*Math.PI)/(2*N));
            }
        }
        return sum;
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2020, 16:19
Ответы с готовыми решениями:

Прямое и обратное преобразование Фурье в Java
Мне нужна библиотека для реализации прямого а затем обратного преобразования Фурье для предварительно записанного звукового сигнала на Java...

Дискретное косинусное преобразование
У меня есть двумерный массив, элементами которого являются знания пикселей синего цвета Затем, я разбила этот массив на блоки...

Дискретное косинусное преобразование. BinDCT
Здравствуйте, Пытаюсь реализовать алгоритм сабжа. Нашел вот такое описание. Вот обычный DCT, с примером, на странице 3 есть исходная...

11
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
07.10.2020, 16:35
Цитата Сообщение от Mari_mar Посмотреть сообщение
Может что-то не так с кодом?
а дебагер, что говорит?
0
1 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 46
07.10.2020, 16:43  [ТС]
Все работает ПОЧТИ правильно, 4 бита отличаются на 1. Округление идет к ближайшем целому. В примере должно выйти, например 23, а ОДКП дает результат 23.7...

Добавлено через 5 минут
ДКП 100% правильно, матрица из примера лекции по ДКП. Не могу найти его свойства - может оно не со 100% вероятностью работает?
0
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
07.10.2020, 16:45
Цитата Сообщение от Mari_mar Посмотреть сообщение
Может что-то не так с кодом?
а дебагер, что говорит?
0
1 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 46
07.10.2020, 16:48  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
а дебагер, что говорит?
В каком смысле?

Добавлено через 2 минуты
Нашла такую фразу "Нельзя не учитывать тот факт, что
вычисления, связанные с переходом в область преобразования ЦИ, вносят
дополнительную погрешность в любой процесс, связанный с возвращением в
пространственную область, что обязательно происходит при стеганопреобразовании".
Но ведь не может быть аж такой частоты искажений
0
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
07.10.2020, 16:51
Цитата Сообщение от Mari_mar Посмотреть сообщение
В каком смысле?
в прямом)) вот, читай Про отладку программ
0
1 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 46
07.10.2020, 16:55  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
в прямом)) вот, читай Про отладку программ
Я в курсе что такое дебагер. Вопрос в том, что мне в нем искать. Вижу какие элементы вносят наибольшее искажение, но что мне это даст? На этапе в скриншоте должно быть значение 23 в итоге
Миниатюры
Обратное дискретное косинусное преобразование  
0
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
07.10.2020, 17:09
Цитата Сообщение от Mari_mar Посмотреть сообщение
Вопрос в том, что мне в нем искать.
кладешь алгоритму минимальные значения и смотришь, дебаг-ом как они себя ведут.

Добавлено через 6 минут
минимальные значения в смысле, по количеству. глянь, как еще формулы упростить на бумажке.
0
1 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 46
07.10.2020, 17:55  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
кладешь алгоритму минимальные значения и смотришь, дебаг-ом как они себя ведут.

Добавлено через 6 минут
минимальные значения в смысле, по количеству. глянь, как еще формулы упростить на бумажке.
На блоках 4х4 все работает правильно
0
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
09.10.2020, 10:11
Mari_mar, мысль зашла по твоему коду. вот смотри, у тебя метод:
Java
1
2
3
4
5
6
7
8
9
private static double ODCP(int[][] f, int i, int j) {
       double sum = 0;
       for (int x = 0; x < N; x++) {
           for (int y = 0; y < N; y++) {
               sum += 0.25 * f[x][y] * c[x] * c[y] * Math.cos(((2 * i + 1) * x * Math.PI) / (2 * N)) * Math.cos(((2 * j + 1) * y * Math.PI) / (2 * N));
           }
       }
       return sum;
   }
i,j внутри не меняются. суммирование, можно представить K * P(x) * G(y). у тебя во внутреннем цикле, т.е. по y, х не меняется, значит, P(x) постоянная, но ты ее вычисляешь, что не может не влиять на накопления ошибок.
0
1 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 46
12.10.2020, 00:58  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
Mari_mar, мысль зашла по твоему коду. вот смотри, у тебя метод:
Java
1
2
3
4
5
6
7
8
9
private static double ODCP(int[][] f, int i, int j) {
       double sum = 0;
       for (int x = 0; x < N; x++) {
           for (int y = 0; y < N; y++) {
               sum += 0.25 * f[x][y] * c[x] * c[y] * Math.cos(((2 * i + 1) * x * Math.PI) / (2 * N)) * Math.cos(((2 * j + 1) * y * Math.PI) / (2 * N));
           }
       }
       return sum;
   }
i,j внутри не меняются. суммирование, можно представить K * P(x) * G(y). у тебя во внутреннем цикле, т.е. по y, х не меняется, значит, P(x) постоянная, но ты ее вычисляешь, что не может не влиять на накопления ошибок.
Можете, пожалуйста, подробнее объяснить? Не очень поняла

Добавлено через 1 минуту
Цитата Сообщение от Aviz__ Посмотреть сообщение
Mari_mar, мысль зашла по твоему коду. вот смотри, у тебя метод:
Java
1
2
3
4
5
6
7
8
9
private static double ODCP(int[][] f, int i, int j) {
       double sum = 0;
       for (int x = 0; x < N; x++) {
           for (int y = 0; y < N; y++) {
               sum += 0.25 * f[x][y] * c[x] * c[y] * Math.cos(((2 * i + 1) * x * Math.PI) / (2 * N)) * Math.cos(((2 * j + 1) * y * Math.PI) / (2 * N));
           }
       }
       return sum;
   }
i,j внутри не меняются. суммирование, можно представить K * P(x) * G(y). у тебя во внутреннем цикле, т.е. по y, х не меняется, значит, P(x) постоянная, но ты ее вычисляешь, что не может не влиять на накопления ошибок.
До этого все косинусы выносила как константы, результат аналогичный
0
 Аватар для Aviz__
2738 / 2047 / 507
Регистрация: 17.02.2014
Сообщений: 9,465
12.10.2020, 07:39
Цитата Сообщение от Mari_mar Посмотреть сообщение
Можете, пожалуйста, подробнее объяснить?
проще не могу, т.к. не знаю куда проще.
Цитата Сообщение от Mari_mar Посмотреть сообщение
все косинусы выносила как константы
все нельзя. второй зависит от переменно внутреннего цикла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2020, 07:39
Помогаю со студенческими работами здесь

Обратное дискретное преобразование Лапласа
Здравствуйте, уважаемые пользователи форума. Долго думал в какой из разделов написать, так как в большей степени вопрос математики, но...

Обратное дискретное преобразование Фурье
Не могу разобраться, что за буква &quot;i&quot; в этой формуле

Что дает дискретно-косинусное преобразование?
Имеется два примерно одинаковых алгоритма нахождения мел-кепстральных коэффициентов. В каждом окончательный результат получаем после...

Как построить графики с нуля по х? (дискретное и обратное преобразования Фурье)
В общем, программа строит мне графики с 1 по оси х. Как сделать, чтобы они строились от 0? Вот функция. function=Func(U,N,A) ...

Символическое дифференцирование-ввод формулы в связный список, преобразование в ПОЛИЗ, обратное преобразование
Прошу помогите мне. Символическое дифференцирование-ввод формулы в связный список, преобразование в ПОЛИЗ, обратное преобразование в...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru