Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Контрольные вопросы

· Что такое цветовое пространство? Что такое цветовая модель? Чем они отличаются? Приведите примеры цветовых пространств и моделей, их свойства. Опишите цветовые пространства, использующиеся в алгоритме JPEG. Проведите пересчет выбранной точки изображения по уравнениям, перехода из одного пространства в другое. Какие компоненты имеют значение при сжатии? Какие еще подобные цветовые пространства вы можете привести?

· Что такое субдискретизация? Какие форматы существуют и чем отличаются друг от друга? Почему возможно осуществить субдискретизацию? Какой из компонентов необходимо передать без потерь, а какие подвергаются (или могут подвергаться) процедуре субдискретизации? Как вы понимаете смысл термина «дискретизация сигнала»? Какие параметры необходимо учитывать при выполнении дискретизации?

· В чем состоит основная идея дискретного косинусного преобразования? Какие два способа записи существуют? К какому классу преобразований относится ДКП. Какими свойствами обладает это преобразование? Можете ли привести другие дискретные преобразования? Приведите пример кодирования с использованием ДКП. Что такое базисные функции ДКП и что они отображают?

· Объясните принцип выполнения операции квантования коэффициентов ДКП. За счет чего вносятся потери в изображения? Какие выделяют типы таблиц квантования? Какие особенности характерны для коэффициентов квантования? Сколько таблиц предусмотрено для использования при кодировании по алгоритму JPEG? Что такое сегментация и как ее выполняют? Как осуществляется разбиение изображения при использовании ДКП и квантования? Приведите пример квантования коэффициентов. Разрешается использовать MATLAB.

· Что такое энтропийное кодирование? Что такое энтропия? Сколько таблиц Хаффмана разрешается использовать, и какие типы таблиц выделяют? Что такое зигзаг сканирование? В дополнительном файле приведены таблицы Хаффмана для компонентов светимости и хроматических компонент. Что такое DC и AC коэффициенты? Как они кодируются? Выполните кодирование блока 8x8 с использованием двух таблиц и покажите отличия. Посчитайте степень сжатия (во сколько раз сжали данные). Что такое PSNR, SNR, какие еще подходы используются для оценки результативности сжатия мультимедиа информации?

· За счет чего в алгоритме JPEG происходит сжатие информации. Поясните суть каждого из этапов кодирования. Приведите пример кодирования блока данных.

· Выполните кодирование по алгоритму JPEG следующего блока размером 8x8 (разрешается использовать MATLAB):

После каждого этапа выполните средствами среды MATLAB визуализацию результатов вычислений. Выполните обратное преобразование блока, оцените потери в данных с использованием соотношения сигнал/шум. Оцените, во сколько раз осуществили сжатие блока. Поясните суть каждого этапа. Сжатие осуществлять по таблицам для светимости.

·  С помощью функции Generate_Scales получите матрицу квантования для блока

для параметров N=8 и трех значений параметра Q (высоких и низких) выполните построение матрицы квантования, выполните квантование матрицы X (с использованием функций, приведенных на занятии). Запишите результаты операции квантования.

function [coefs_scale] = Generate_Scales(N, Quality)

% Генерация коэффициентов квантования для масштабирования коэф. ДКП

% Входные параметры: % N - количество элементов в квадратной матрице

% Quality - условное значение параметра качества >0 % Выходные параметры:

% coefs_scale - матрица коэффициентов квантования размером NxN (double)

% Алгоритм: % Формирование матрицы с монотонно увеличивающимися коэффициентами

%

coefs_scale = zeros(N); % заранее генерируем квадратную матрицу

%--

% Вариант 1 - с поэлементной обработкой

%for m=1:N

% for n=1:N

% coefs_scale(m, n) = 1 + (m+n)*Quality;

% end

%end

%--

% Вариант 2 - ориентированный на векторную обработку

% выполняется быстрее в 3-5 раз (в зависимости от N)

coefs_scale(1,:) = (1+(1+1)*Quality):Quality:(1+(1+N)*Quality);

% генерируем первую строку

for m=2:N

coefs_scale(m,:) = coefs_scale(m-1,:) + Quality;

% остаток строки увеличиваем на Quality

End

Сравните быстродействие обоих вариантов с помощью команд tic и toc.

·  Выполните преобразование изображения из пространства rgb в четыре основных типа изображений, используемых в среде MATLAB. Выпишите характеристики изображений. Найдите команду (после вывода изображения) корректирования контраста изображения. Проведите эксперименты и запишите результаты.

·  Что представляет собой гистограмма изображения, и какие бывают типы изображений? За счет чего может получиться ошибка в результате фотосъемки?

·  В файле приведены таблицы, с помощью которых возможно получение кода Хаффмана. Допустим, после квантования блок получился следующим:

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

НЕ нашли? Не то? Что вы ищете?

·  Преобразуйте исходное изображение в полутоновое, постройте гистограмму изображения, объясните за счет чего может произойти сжатие изображения. С помощью команды imwrite(записи – справка с помощью команды help) преобразуйте полутоновое изображение в bmp и выполните ДКП и квантование. Восстановите изображение и сравните с помощью отношения сигнал/шум исходное и восстановленное изображения.

·  Откройте в FAR-Manager (в шестнадцатеричном виде) изображение и выполните структурный анализ (выпишите маркеры и их значения). Для секций, содержащих таблицы, определите длины таблиц.

·  Перечислите достоинства и недостатки рассмотренного алгоритма JPEG. Напишите функцию, выполняющую дискретное косинусное преобразование, не используя команды среды MATLAB. Для блока 4x4 проверьте правильность выполнения функции.

·  В результате выполнения ДКП получили блок:

Выполните его квантование и закодируйте, используя таблицы Хаффмана (использовать из файла). Как вы думаете, почему некоторые компоненты блока выделены красным цветом? Как это можно использовать для более эффективного сжатия блока? В обоих случаях выполните кодирование и декодирование. Оцените, во сколько раз осуществили сжатие в том и другом случае.

· Что такое стандарт сжатия графической информации? Как происходит стандартизация алгоритмов сжатия? В чем состоит отличие формата от алгоритма? Приведите пример форматов графических файлов. Кратко опишите их особенности. Приведите классификацию алгоритмов сжатия, выделив основные группы алгоритмов. Охарактеризуйте основные черты алгоритмов сжатия. Где применяются алгоритмы сжатия? В каких случаях целесообразно применять алгоритм JPEG и почему? Перечислите типы алгоритмов JPEG, описанные в стандарте и опишите кратко их особенности.

· Перечислите основные команды среды MATLAB для обработки изображений (чтение и запись, вывод, редактирование, преобразование типов изображения) Каким образом в MATLAB представляется изображение? Опишите интерфейс среды MATLAB. Что такое гистограмма? Как с помощью средств графического интерфейса создать форму для выполнения различных задач? Приведите пример создания формы. Что такое профилировшик (Profiler)? Приведите пример использования и анализ результатов? За что отвечают команды tic и toc?

·  Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение (что проверяет, что такое базовые блоки ДКП)

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function basisMatrix (имеет вспомогательное назначение – использовалась для проверки демонстрации базовых блоков ДКП, есть смысл ее включить в набор функций)

global Params % для наглядности вводим коэффициент "растяжения" поверхности

% (масштабирования по горизонтали)

resolution = 10; % считать с формы параметры кодирования

figure; % открываем новое окно

N = Params. BlockSize;

for k = 1:N

for l = 1:N

subplot( N, N,(k-1)*N+l );

% выбираем часть окна для вывода графика

% формируем матрицу для получения формы базисной функции

in = zeros(N*resolution);

in(k, l) = 1; % "тестовый сигнал" для оценки отклика

% выполнить прямое ДКП

out = dct2(in);

mesh(out); % вывести в заданной части окна

axis off; % отключить вывод числовых осей на графике

end

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [cut_linear_coefs, num_coefs] = CutCoefs(linear_coefs)

global Params % выделяем память под массивы "обрезанных" коэффициентов

cut_linear_coefs = zeros(Params. NumBlocks(1)*Params. NumBlocks(2), ...

Params. BlockSize*Params. BlockSize);

% и под массив количества коэффициентов в каждом блоке

num_coefs = zeros(Params. NumBlocks(1)*Params. NumBlocks(2),1);

% вспомогательные временные переменные – для краткости

d = uint16(Params. BlockSize);

t = d*d; % в зависимости от установленного способа кодирования коэффициентов ДКП

switch Params. CodeNonZero

case 0 % кодировать заданное число коэффициентов

% строим маску, одинаковую для всех блоков

mask = ones(1, Params. NumFirstDCTCoefs);

if Params. NumFirstDCTCoefs < t

add_mask = zeros(1, t-Params. NumFirstDCTCoefs);

mask = [mask add_mask];

end

% проходим по всем блокам заданного размера

for m = 1:Params. NumBlocks(1)*Params. NumBlocks(2)

% количество линейных блоков

cut_linear_coefs(m, :) = linear_coefs(m, :) .* mask;

% обнуляем лишние коэффициенты

num_coefs(m+1) = Params. NumFirstDCTCoefs; % количество коэффициентов!=0

end

case 1 % кодировать все ненулевые коэффициенты

% проходим по всем блокам заданного размера

for m = 1:Params. NumBlocks(1)*Params. NumBlocks(2)

% количество линейных блоков % находим индекс последнего коэффициента, неравного 0

last_non_zero_ind = find(linear_coefs(m, :), 1, 'last');

% строим маску с необходимым числом единиц и нулей

if (last_non_zero_ind == t) % чтобы в цикле избежать изменения размера

mask = ones(1, last_non_zero_ind);

elseif isempty(last_non_zero_ind) % хотя бы один коэффициент должен быть

last_non_zero_ind = 1; mask = [ones(1, last_non_zero_ind) zeros(1, t-last_non_zero_ind)];

else mask = [ones(1, last_non_zero_ind) zeros(1, t-last_non_zero_ind)];

end

cut_linear_coefs(m, :) = linear_coefs(m, :) .* mask; % обнуляем лишние коэффициенты

num_coefs(m+1) = last_non_zero_ind; % количество коэффициентов!=0

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [out_image] = DCT2Im(in_image)

global Params

out_image = zeros(Params. ImageSize);

% создаем матрицу для хранения восст. изображения

% проходим по всем блокам заданного размера

d = uint16(Params. BlockSize);

% d – размер блока по каждой оси % в цикле используем векторизацию – за один раз рассчитываем

% сразу целый блок благодаря использованию конструкций [1:d]

for m = 0:Params. NumBlocks(1)-1 % количество блоков по вертикали

for n = 0:Params. NumBlocks(2)-1 % количество блоков по горизонтали

out_image(m*d+[1:d], n*d+[1:d]) = idct2(in_image(m*d+[1:d], n*d+[1:d]));

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [out_image] = DCT2Scale(in_image)

global Params

out_image = zeros(Params. ImageSize);

coef_scales = generate_Scales(Params. BlockSize, Params. Quality);

d = uint16(Params. BlockSize);

for m=0:Params. NumBlocks(1)-1

for n=0:Params. NumBlocks(2)-1

out_image(m*d+[1:d], n*d+[1:d]) = round(in_image(m*d+[1:d], n*d+[1:d]) ...

./ coef_scales);

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [c_ratio] = EstimateBitRate(cut_linear_coefs)

global Params

c_ratio = 0; % сформировать примерные длины кодов Хаффмана

table_code_len = Generate_Scales(Params. BlockSize*Params. BlockSize, 0);

% проходим по всем блокам заданного размера

pDC = 0; % последний DC-коэф. сначала = 0

for m = 1:Params. NumBlocks(1)*Params. NumBlocks(2) % количество линейных блоков

% рассчитать размер каждого блока

s = EstimateBlockBitRate(cut_linear_coefs(m, :), pDC, table_code_len);

pDC = cut_linear_coefs(m, 1); % запомнить последний DC

c_ratio = c_ratio + s; % суммируем по всему изображению

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [block_bitrate] = EstimateBlockBitRate(linear_block, prev_DC, table_len)

% Оценка размера блока в битах в соответствии с кодированием квантованныx

% коэффициентов ДКП в алгоритме JPEG

% Входные параметры:

% linear_block - массив целочисленных значений Nx1

% prev_DC - значение первого коэффициента предыдущего % блока

% table_len - условная таблица длин кодов Хаффмана % (Nxn) элементов

% Выходные параметры: % block_bitrate - размер блока в битах

% Алгоритм: % Кодирование первого значения (DC) и остальных значений (AC)

% выполняется по отдельности. % Для кодирования DC вычисляется разность между DC и prev_DC,

% которая кодируется унарным кодом + само число. Для оценки

% длины кода достаточно использовать двойную длину унарного % кода

% При кодировании AC каждое число заменяется на пару % <число_нулей, значение>. Для этой пары берется код из

% таблицы Хаффмана. Для оценки кода достаточно знать длину

% этого кода

%-------

N = size(linear_block, 1); % определяем размер массива

% рассчитываем размер кода для DC-коэффициента

diff = linear_block(1) - prev_DC;

block_bitrate = 2*(size(abs(diff),2)+1);

% унарный код + само число.

% рассчитываем размер кода для всех AC-коэффициентов

nz_ind = find(linear_block); % получаем список всех ненулевых коэффициентов

snd = size(nz_ind,2);

%число ненулевых коэффициентов

%--

% Вариант 1 - с поэлементной обработкой % начинаем обход всех ненулевых со

% второго ненулевого элемента

%for i=2:snd % Z = nz_ind(i) - nz_ind(i-1);

% число нулей между ними + 1 (для доступа к таблице)

% x = linear_block(nz_ind(i)); % само значение % R = ceil(log2(abs(x))) + 1;

% длина унарного кода значения - № строки в таблице % C = R; % длина номера столбца в таблице %

% лишняя (можно вместо C использовать R) % block_bitrate = block_bitrate + table_len(R, Z+1) + C;

%end % добавляем 4 бита на символ конца блока %block_bitrate = block_bitrate + 4;

%--

% Вариант 2 - с векторной обработкой % сначала находим смещение каждого ненулевого коэффициента от

% предыдущего. Для этого просто сдвигаем вектор индексов на 1 и поэлементно % вычитаем из исходного

nz_ind_shift = nz_ind(1:(snd-1)); % берем только первые SND-1 ненулевых коэффициентов

Z = nz_ind(2:snd) - nz_ind_shift; % вычитаем их из первого (кроме первого эл-нта) вектора

x = linear_block(nz_ind(2:size(nz_ind,2))); % берем вектор самих значений

R = ceil(log2(abs(x))) + 1; % рассчитываем количество битов

C = R; % запомнить (лишняя, можно вместо C исп-ть R)

ind = (Z-1)*N+R; % находим линейные индексы для таблицы

block_bitrate = sum(table_len(ind) + C) + 4; % суммируем длины кодовых слов и C + 4 бита (EOB)

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [coefs_scale] = Generate_Scales(N, Quality)

% Генерация коэффициентов квантования для масштабирования коэф. ДКП

% Входные параметры: % N - количество элементов в квадратной матрице

% Quality - условное значение параметра качества >0 % Выходные параметры:

% coefs_scale - матрица коэффициентов квантования размером NxN (double)

% Алгоритм: % Формирование матрицы с монотонно увеличивающимися коэффициентами

%

coefs_scale = zeros(N); % заранее генерируем квадратную матрицу

%--

% Вариант 1 - с поэлементной обработкой

%for m=1:N

% for n=1:N

% coefs_scale(m, n) = 1 + (m+n)*Quality;

% end

%end

%--

% Вариант 2 - ориентированный на векторную обработку

% выполняется быстрее в 3-5 раз (в зависимости от N)

coefs_scale(1,:) = (1+(1+1)*Quality):Quality:(1+(1+N)*Quality);

% генерируем первую строку

for m=2:N

coefs_scale(m,:) = coefs_scale(m-1,:) + Quality;

% ост. строки увеличиваем на Quality

end %-----

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [Indices, Indices_l] = Generate_Zigzag(N)

% Генерация индексов для обхода матрицы по зигзагу

% Входные параметры:

% N - количество элементов в квадратной матрице

% Выходные параметры: % Indices - массив (N^2,2), содержащий номера строк

% и столбцов элементов квадратной матрица в порядке

% обхода. Первый столбец соответствует номеру строки,

% второй столбец - номера столбца % Indices_l - массив (N^2,1), содержащий ту же самую

% информацию, что и Indices, но номера

% приведены в виде одномерного смещения от начала

% массива. При этом учитывается, что матрица в MATLAB

% хранится по столбцам!

%

Indices = zeros(N*N, 2); % заранее выделяем место под матрицу (N^2 x 2)

% Первую диагонально проходим вручную (один элемент)

Indices(1, :) = [1 1];

a = 2; % сдвигаем индекс в таблице индексов % обрабатываем диагонали длиной больше 1 (все, кроме первой и последней)

for t=2:1:(2*N-2) % В матрице NxN строк есть 2N-1 диагоналей. Одну уже прошли

% сначала отрабатываем переход на первый элемент диагонали

% и устаналиваем необходимые параметры движения по ней

if (rem(t,2)~=0) % если диагональ нечетная (rem – остаток от деления)

dr = 1; dc = -1; % приращения для перехода к следующему элементу диагонали

if (t <= N) % длина диагонали растет или уменьшается?

P = t; % если растет - то число элементов равно номеру диагонали

Indices(a, 1) = Indices(a-1, 1);

Indices(a, 2) = Indices(a-1, 2)+1;

else

P = 2*N-t; % иначе: (2N - номер диагонали)

Indices(a, 1) = Indices(a-1, 1)+1;

Indices(a, 2) = Indices(a-1, 2);

end

else % если диагональ четная

dr = -1;

dc = 1;

if (t <= N) % длина диагонали растет или уменьшается?

P = t; % если растет - то число элементов равно номеру диагонали

Indices(a, 1) = Indices(a-1, 1) + 1;

Indices(a, 2) = Indices(a-1, 2);

else

P = 2*N-t; % иначе: (2N - номер диагонали)

Indices(a, 1) = Indices(a-1, 1);

Indices(a, 2) = Indices(a-1, 2)+1;

end

end

a = a + 1; % первый элемент диагонали обработали

% теперь проходим по оставшимся элементам диагонали

for i=2:1:P

Indices(a, 1) = Indices(a-1, 1) + dr;

Indices(a, 2) = Indices(a-1, 2) + dc;

a = a + 1;

end

end % Последнюю диагонально проходим вручную (один элемент)

Indices(N*N, :) = [N N]; % Дополнительно расчитывает линейные индексы элементов

% Для преобразования (row, col) => ind может использоваться

% функция sub2ind вида % ix = sub2ind([n n], ind(:,1), ind(:,2));

% Но поскольку она очень "медленная", то вместо нее

% лучше рассчитывать смещение от начала матрицы "вручную". При этом

% следует помнить, что в MATLAB двумерный массив хранится по столбцам.

Indices_l = (Indices(:,2)-1)*N + Indices(:,1);

%

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [out_image] = Im2DCT(in_image)

global Params

out_image = zeros(Params. ImageSize);

% создаем матрицу для хранения ДКП

% проходим по всем блокам заданного размера

d = uint16(Params. BlockSize);

% d – размер блока по каждой оси

% в цикле используем векторизацию – за один раз рассчитываем

% сразу целый блок благодаря использованию конструкций [1:d]

for m = 0:Params. NumBlocks(1)-1 % количество блоков по вертикали

for n = 0:Params. NumBlocks(2)-1 % количество блоков по горизонтали

out_image(m*d+[1:d], n*d+[1:d]) = dct2(in_image(m*d+[1:d], n*d+[1:d]));

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function read_params(hObject, eventdata, handles)

global Params % взять выбранный размер блока

% Params. BlockSize = 8;

sfd = get(handles. menu, 'String'); %выбор размера блока из меню.

Params. BlockSize = str2num(strtok(sfd{get(handles. menu, 'Value')}));

Params. Quality = round(get(handles. slider_Quality, 'Value'));

% режим кодирования коэффициентов ДКП

Params. CodeNonZero = get(handles. radiobutton_CodeNonZero, 'Value');

% количество оставляемых ДКП коэффициентов Params. NumFirstDCTCoefs = 0;

if (Params. CodeNonZero == 0) % если надо кодировать только первые коэффициенты

Params. NumFirstDCTCoefs = uint16(str2num(get(handles. edit_NumFirstDCTCoefs, 'String')));

% проверить, чтобы число оставляемых коэффициентов было не больше

% числа коэффциентов в блоке. Если что – скорректировать

if (Params. NumFirstDCTCoefs > Params. BlockSize*Params. BlockSize )

Params. NumFirstDCTCoefs = Params. BlockSize*Params. BlockSize;

set(handles. edit_NumFirstDCTCoefs, 'String', num2str(Params. NumFirstDCTCoefs));

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [out_matrix] = RollMatrix(in_linear, ind, ind_l)

% Сворачивание вектора в квадратную матрицу в вектор путем обхода по зигзагу

% Входные параметры: % in_linear - исходный вектор

% ind - массив индексов (NxN,2) % ind_l - массив индексов (NxN,1)- индексы представлены

% в виде смещений от начала массива (т. е. одним % числом) % Выходные параметры:

% out_matrix - матрица, содержащая элементы вектора, % упорядоченные в соответствии с таблицей индексов

%

n = sqrt(size(in_linear, 2));

% из размера вектора определить размер матрицы

out_matrix = zeros(n);

% заранее выделяем место под квадратную матрицу

%--

% Вариант 1 - с поэлементной обработкой %for i=1:n*n % out_matrix(ind(i,1), ind(i,2)) = in_linear(i); %end

%--

% Вариант 2 - с векторной обработкой % для чтения сразу нескольких элементов матрицы необходимо, чтобы

% индексы ее элементов были перечислены в необходимом порядке % виде скалярных значений.

out_matrix(ind_l) = in_linear;

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function out_image = Scale2DCT(in_image)

global Params

out_image = zeros(Params. ImageSize);

% создаем матрицу для хранения восст. коэффициентов

% сгенерировать коэффициенты масштабирования

coef_descales = Generate_Scales(Params. BlockSize, Params. Quality);

d = uint16(Params. BlockSize); % d – размер блока по каждой оси

% проходим по всем блокам заданного размера

for m = 0:Params. NumBlocks(1)-1 % количество блоков по вертикали

for n = 0:Params. NumBlocks(2)-1 % количество блоков по горизонтали

out_image(m*d+[1:d], n*d+[1:d]) = in_image(m*d+[1:d], n*d+[1:d]).* coef_descales;

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function linear_coefs = Scale2Zigzag(in_image)

global Params

% заранее выделить место под линейное хранение коэффициентов

% двумерный массив. Число строк – полное число блоков, число столбцов –

% количество элементов в блоке

linear_coefs = zeros(Params. NumBlocks(1)*Params. NumBlocks(2), ...

Params. BlockSize*Params. BlockSize);

% сформировать последовательность индексов для обхода зигзагом

% формируются индексы и в матричной форме и в линейной (для самопроверки)

% после тестирования достаточно оставить только линейную форму

[zigzag_ind, zigzag_ind_l] = Generate_Zigzag(Params. BlockSize);

% проходим по всем блокам заданного размера

d = uint16(Params. BlockSize); % d – размер блока по каждой оси

t = d*d; % t – число элементов в блоке

p = 1; % храним в новом массиве

for m = 0:Params. NumBlocks(1)-1

% количество блоков по вертикали

for n = 0:Params. NumBlocks(2)-1

% количество блоков по горизонтали

ttt = UnrollMatrix(in_image(m*d+[1:d], n*d+[1:d]), zigzag_ind, zigzag_ind_l);

linear_coefs(p, :) = ttt;

% запомнить результат

p = p+1;

% перейти к следующему блоку

end

end

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [res] = SNR(im_x, im_y)

% Вычисление отношения сигнал-шум % Входные параметры:

% im_x - исходное изображение % im_y - восстановленное изображение %

% Изображения должны быть одинакового размера

% Выходные параметры:

% res - отношение сигнал-шум

%

N = size(im_x,1) * size(im_x,2);

% количество пикселов в изображении

% находим мощность исходного изображения

imx_sq = im_x.* im_x; % Src*Src – каждый элемент – в квадрат

P_x = sum(sum(imx_sq))/N; % Power(Src) – разделить сумму всех элементов % матрицы на число элементов

% находим ошибку кодирования

e = im_x-im_y; % одной командой – сразу всю матрицу обрабатываем % расчет мощности ошибки

e_sq = e.*e; P_e = sum(sum(e_sq))/N; % отношение сигнал-шум

res = 10*log10(P_x/P_e); % присваиваем значение выходному параметру

%

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function [out_linear] = UnrollMatrix(in_matrix, ind, ind_l)

% Разворачивание матрицы в вектор путем обхода в заданном порядке

% Входные параметры: % in_matrix - исходная матрица

% ind - массив индексов (NxN,2) % ind_l - массив индексов (NxN,1)- индексы представлены

% в виде смещений от начала массива (т. е. одним

% числом)

% Выходные параметры: % out_linear - вектор, содержащий элементы матрицы, %

% упорядоченные в соответствии таблицей индексов

%

n = size(in_matrix, 1); % взять размер полученной квадратной матрицы

out_linear = zeros(1, n*n); % заранее выделяем место под массив-вектор 1xN^2

%--

% Вариант 1 - с поэлементной обработкой

% в цикле формируем вектор, выбирая в него элементы матрицы

% в порядке, который определен таблице индексов ind

%for i=1:n*n % out_linear(i) = in_matrix(ind(i,1), ind(i,2)); %end

%--

% Вариант 2 - с векторной обработкой

% для чтения сразу нескольких элементов матрицы необходимо, чтобы

% индексы ее элементов были перечислены в необходимом порядке

% виде скалярных значений.

out_linear = in_matrix(ind_l);

· Для приведенной функции ответьте на вопросы:

1)Название

2)Назначение

3)Способы вызова (с примерами)

4)Свойства (входные и выходные параметры, что происходит при выполнении функции, что записывается в глобальные переменные)

function out_image = Zigzag2Scale(linear_coefs)

global Params % заранее выделить место под матрицу

out_image = zeros(Params. ImageSize(1),Params. ImageSize(2));

% сформировать последовательность индексов для обхода зигзагом

% формируются индексы и в матричной форме и в линейной (для самопроверки)

% после тестирования достаточно оставить только линейную форму

[zigzag_ind, zigzag_ind_l] = Generate_Zigzag(Params. BlockSize);

% проходим по всем блокам заданного размера

d = uint16(Params. BlockSize); % d – размер блока по каждой оси

t = d*d; % t – число элементов в блоке

p = 1; % храним в новом массиве

for m = 0:Params. NumBlocks(1)-1 % количество блоков по вертикали

for n = 0:Params. NumBlocks(2)-1 % количество блоков по горизонтали

out_image(m*d+[1:d], n*d+[1:d]) = RollMatrix(linear_coefs(p, :), ...

zigzag_ind, zigzag_ind_l);

p = p+1;

end

end