Компрессия полутонового изображения
Разработка программы, предназначенной для сжатия или компрессии полутонового изображения международным стандартом JPEG. Описание метода JPEG, выдача результатов в виде декодированного изображения. Обзор методов компрессии полутонового изображения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.10.2012 |
Размер файла | 43,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Аннотация
В данном документе описывается программа, написанная в соответствии с постановкой задачи на курсовое проектирование по теме "Компрессия полутонового изображения" по дисциплине "Кодирование и защита информации". Данная программа предназначена для сжатия или компрессии полутонового изображения международным стандартом JPEG. Входными данными является изображение типа BMP. Для проверки работы программы разработан тестовый пример. Результаты тестирования доказывают, что программа правильно выполняет все операции по сжатию полутонового изображения и выдачи результатов в виде декодированного изображения.
Требованием к аппаратному и программному обеспечению является наличие любого IBM-совместимого компьютера с наличием накопителя на гибких и (или) жестких магнитных дисках и наличием достаточного количества оперативной памяти (достаточно 640к). На компьютере должна быть установлена операционная система Windows98 (или выше) или любая другая, совместимая с ней.
Содержание
Введение
Постановка задачи по разработке программы
Входные данные
Выходные данные
Обзор методов компрессии полутонового изображения
Описание метода JPEG
Тестирование программы
Заключение
Библиографический список
Приложение
Введение
Кодирование изображений с частичной потерей информации.
Изображения, в которых яркость изменяется непрерывно от уровня белого к черному, называется полутоновыми или много-градационными. Сигналы полутоновых изображений, в отличие от черно-белых факсимиле, являются аналоговыми. Поэтому для последующей их обработки с помощью ЭВМ они подвергаются дискретизации и квантованию. Сигналы полутонового неподвижного изображения представляют собой двухмерную функцию распределения яркости В(х, у) на плоскости с координатами х и у.
Сжимаемые изображения предназначаются для восприятия их человеком, либо для обработки автоматическими устройствами. Если изображение кодируется для передачи зрителю, то уменьшить объем передаваемой информации можно, используя особенности восприятия зрительного анализатора. Поскольку точность восприятия зрительного анализатора человека ограничена, то это позволяет считать некоторые искажения изображения незаметными или незначительными. Эта особенность дает возможность сжимать исходное изображение за счет потери части малозначительной информации, т.е. вносить определенные искажения. При декодировании, естественно, исключенная информация не может быть восстановлена и изображение воспроизводится с некоторой погрешностью. Различные методы кодирования вносят искажения разной степени. Поэтому при разработке системы компрессии изображения необходимо выбрать такой метод преобразования, который вносит наименее заметные искажения. В настоящее время большинство систем сжатия черно-белых и цветных неподвижных и подвижных изображений являются системы с потерей части. В то же время имеются области применения обработки изображений с использованием автоматических анализаторов, где потери какой-либо части изображений не допускаются.
При проектировании и оценке эффективности методов сжатия изображений необходимо иметь достоверную количественную меру качества изображения. К сожалению, не существует аналитической объективно адекватной меры качества изображения для различных систем сжатия изображений. Поэтому для характеристики качества применяются шкалы субъективной оценки качества изображения, испытательные изображения, численные зависимости качества от искажений. Любая «хорошая» мера качества изображения должна быть коррелированна с субъективными оценками качества изображения, представленными в виде шкалы. Существует две шкалы субъективной оценки: шкала качества и шкала ухудшения изображения. Обычно используется пятибалльная система оценок. Каждая ступень качества шкалы характеризует качество рассматриваемого изображения с учетом некоторого множества испытательных изображений. По шкале ухудшения можно оценить степень искажения кодируемого изображения по отношению к некоторому сходному изображению. В таблице приведены шкалы качества и ухудшения, принятые в технике передачи изображений.
Шкала качества и ухудшения изображения |
|||
Качество |
Оценка в баллах |
Ухудшение |
|
Отличное Хорошее Удовлетворительное Плохое Очень плохое |
5 4 3 2 1 |
Незаметно Заметно, но не мешает Слегка мешает Мешает Очень мешает |
Процедура оценки качества изображения осуществляется методом экспертной оценки. До эксперимента экспертам предъявляется неискаженное испытательное изображение. В течение эксперимента периодически показывают неискаженное изображение, сменяющееся с оцениваемым или рядом с ним.
Числовые оценки качества изображения делятся на два класса: одномерные и двумерные. Одномерные используются только для одного изображения и измерительная шкала калибруется с помощью сравнения оцениваемого изображения с исходным. Двумерные являются дифференциальными показателями качества изображения до обработки и после. Одномерные методы, как правило, основываются на пространственном спектре изображения. Типичные меры качества изображения включают общую или среднюю энергию сигнала на всех частотах. Другой класс одномерных числовых мер основан на использовании статистических характеристик изображения, в частности, математического ожидания. Одномерная гистограмма показывает распределение в изображении пикселей с определенным уровнем яркости. Такую гистограмму можно рассматривать как аппроксимацию одномерной плоскости распределения вероятностей изображения. По ее форме можно судить о контрастности изображения. Аналогично двумерная гистограмма - это аппроксимация двумерной плотности распределения вероятностей изображения. Ширина такой гистограммы в диагональном направлении указывает на пространственную корреляцию изображения.
Двумерные методы качества изображения применяют наиболее часто при оценке качества сжатого изображения, поскольку они указывают на относительные искажения закодированного изображения по сравнению с исходным. Самой распространенной мерой является среднеквадратическая ошибка, представляющая собой разность между значениями соответствующих пикселей исходного и искаженного изображения. К сожалению, среднеквадратическая ошибка часто слабо коррелированна с субъективными оценками качества изображения.
1. Постановка задачи по разработке программы
Требуется написать программу, наглядно демонстрирующую работоспособность международного стандарта JPEG, т.е. необходимо сжать и закодировать информацию, представленную в виде полутонового неподвижного изображения, а затем ее декодировать и наглядно предоставить в виде полутонового изображения.
2. Входные данные
Входными данными являются файлы типа BMP
3. Выходные данные
Выходными данными является неподвижное цветное изображение, находящееся на форме программы, которое демонстрирует метод JPEG, а также закодированный файл, который формируется в ходе выполнения программы.
4. Обзор методов
Описание формата BMP для Window 3.0 (DIB)
Основным отличием файлов нового формата (DIB) - Device Independent Bitmap (аппаратно-независимый битовый образ) является то, что в них используется кодировка цветов с одной битовой плоскостью.
Файлы битовых образов нового формата начинаются со структуры BITMAPFILEHEADER:
typedef struct tagBITMAPFILEHEADER {
word bfType; //тип файла (для битового образа - BM)
dword bfSize; //размер файла в dword
word bfReserved1; //не используется
word bfReserved2; //не используется
dword bfOffbits; //смещение данных битового образа от заголовка в байтах
}
Непосредственно за ней располагается структура BITMAPINFO, содержащая всю информацию о битовом образе. Она делится на две части: структуру BITMAPINFOHEADER, описывающей размеры и цветовой формат битового образа, и массив структур RGBQUAD, определяющей цветовую палитру:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
}
typedef struct tagBITMAPINFOHEADER {
dword biSize; //число байт, занимаемых структурой BITMAPINFOHEADER
dword biWidth; //ширина битового образа в пикселах
dword biHeight; //высота битового образа в пикселах
word biPlanes; //число битовых плоскостей устройства
word biBitCount; //число битов на пиксель
dword biCompression; //тип сжатия
dword biSizeImage; //размер картинки в байтах
dword biXPelsPerMeter;//горизонтальное разрешение устройства, пиксел/м
dword biYPelPerMeter; //вертикальное разрешение устройства, пиксел/м
dword biClrUsed; //число используемых цветов
dword biClrImportant; //число "важных" цветов
} BITMAPINFOHEADER;
Более подробно:
biSize - обычно используется для облегчения доступа к таблице цветов.
biPlanes - определяет число битовых плоскостей; однако, поскольку цвет кодируется последовательными битами, это число всегда равно 1.
biBitCount - этим полем определяется число цветов, используемых битовым образом. В зависимости от способа кодирования, может принимать значения:
1 - битовый образ монохромный, и таблица цветов должна содержать два элемента. Каждый бит в массиве данных кодирует один пиксель. Если значение бита - 0, то пиксель становится первым цветом таблицы; если - 1, пиксель становится вторым цветом таблицы.
4 - битовый образ имеет максимум 16 цветов, и массив bmiColors (таблица цветов) имеет до 16 элементов. Цвет каждого пикселя определяется по таблице цветов при помощи четырехбитного индекса. Например, если первый байт данных имеет значение 3Ah, то при отображении битового образа цвет первого пикселя определяет четвертый элемент таблицы цветов, а цвет второго - одиннадцатый.
8 - битовый образ имеет максимум 256 цветов, и таблица цветов имеет до 256 элементов. Каждый байт массива данных определяет цвет одного пикселя.
24 - битовый образ имеет максимум 2 в 24-й степени цветов. Таблица цветов пуста, а цвет пикселей определяется пакетами из трех байтов, описывающими цветовые интенсивности красного, зеленого и голубого цветов.
biCompression - тип сжатия. Может принимать значения:
BI_RGB - сжатие отсутствует;
BI_RLE8 - сжатие для формата 8 бит на пиксель;
BI_RLE4 - сжатие для формата 4 бита на пиксель.
biXPelsPerMeter и biYPelsPerMeter - могут использоваться для выбора из списка ресурсов пиктограммы, наиболее подходящей для данного устройства.
biClrUsed - число цветов, используемых данным битовым образом. Если 0, то используются все цвета палитры (указанные в массиве bmiColors).
biClrImportant - используется для управления алгоритмом отображения цветов. Так, если четыре различных приложения отображают на экране по одному битовому образу с 75 цветами каждый, то адаптер, выводящий 256 цветов одновременно, не сможет полностью аутентично отобразить на экране все 4 картинки. В этом случае используется механизм замены цветов - ищется битовый образ с наименьшим приоритетом и его "лишние" цвета заменяются наиболее подходящими.
typedef struct tagRGBQUAD {
byte rgbRed; //интенсивность красного
byte rgbGreen; //интенсивность зеленого
byte rgbBlue; //интенсивность голубого
byte rgbRserved; //не используется
} RGBQUAD;
После того, как все параметры битового образа определены, в файле идут сами скан-строки битовой плоскости, причем первой скан-строкой в формате DIB считается нижняя скан-строка (т.е. начало координат находится в левом нижнем углу изображения).
ОСНОВЫ СЖАТИЯ МЕТОДОМ JPEG
Алгоритм JPEG можно разделить на несколько этапов
1. ДКП (Дискретно Косинусоидальное Преобразование).
2. Квантование
3. Вторичное сжатие
Цветное изображение обычно представляет собой комбинацию трех цветов: красного зеленного и синего. Каждый из них обрабатывается независимо от других и для кодирования каждого из них выделяется от 6 до8 битов на отсчет. При кодировании полутонового изображения, в отличие от цветного, не происходит разбиение отсчетов на три составляющих и для кодирования каждого из отсчетов затрачивается от 6 до 8 бит.
Этап 1. ДКП
В соответствии с алгоритмом ДКП последовательность отсчетов яркости пикселей преобразуется из трехмерного пространства (координаты изображения X,Y и яркость B) в идентичное представление в частотной области. Другими словами, посредством косинусного преобразования осуществляется преобразование пространственной информации в частотную (спектральную).
Дискретное косинусное преобразование является обратимым, то есть, посредством обратного косинусного преобразования осуществляется перенос сигнала из частотной области в пространственное представление. Косинусное преобразование оперирует с квадратной матрицей отсчетов яркости элементов изображения B(x,y) размером N*N пикселов. Результатом преобразования является квадратная матрица N*N частотных коэффициентов (трансформант) F(i,j).
Формулы для прямого и обратного ДКП представлены соответственно выражениями:
N-1 N-1
F(i,j)=(1/sqr(2N))*C(i)C(j)У У B(x,y)* cos((2x+1)iП/2N)* cos((2y+1)jП/2N);
x=0 y=0
N-1 N-1
B(x,y)= (1/sqr(2N))* У У C(i)C(j)F(i,j)* cos((2x+1)iП/2N)* cos((2y+1)jП/2N);
i=0 j-0
Здесь C(i) и C(j) равны 1/sqr(2) для i,j=0 и C(i), C(j)=1 при i,j>0;
B(x,y) - значение отсчета яркости пиксела фрагмента изображения с координатами x и y.
Для начала следует создать ДКП матрицу, используя формулу:
DCT = 1/sqr(N), если i=0
ij
DCT = sqr(2/N)*cos[(2j+1)*i*3.14/2N], если i > 0
ij
N = 8, 0 < i < 7, 0 < j < 7
в результате имеем:
|.353553.353553.353553.353553.353553.353553.353553.353553|
|.490393.415818.277992.097887 -.097106 -.277329 -.415375 -.490246|
|.461978.191618 -.190882 -.461673 -.462282 -.192353.190145.461366|
DCT = |.414818 -.097106 -.490246 -.278653.276667.490710.099448 -.414486|
|.353694 -.353131 -.354256.352567.354819 -.352001 -.355378.351435|
|.277992 -.490246.096324.416700 -.414486 -.100228.491013 -.274673|
|.191618 -.462282.461366 -.189409 -.193822.463187 -.460440.187195|
|.097887 -.278653.416700 -.490862.489771 -.413593.274008 -.092414|
например, нам нужно сжать следующий фрагмент изображения:
| 95 88 88 87 95 88 95 95|
|143 144 151 151 153 170 183 181|
|153 151 162 166 162 151 126 117|
IMG = |143 144 133 130 143 153 159 175|
|123 112 116 130 143 147 162 189|
|133 151 162 166 170 188 166 128|
|160 168 166 159 135 101 93 98|
|154 155 153 144 126 106 118 133|
|-33 -40 -40 -41 -33 -40 -33 -33|
| 15 16 23 23 25 42 55 53|
| 25 23 34 38 34 23 -2 -11|
IMG = | 15 16 5 2 15 25 31 47|
| -5 -16 -12 2 15 19 34 61|
| 5 23 34 38 42 60 38 0|
| 32 40 38 31 7 -27 -35 -30|
| 26 27 25 16 -2 -22 -10 5|
вот формула, по которой производится ДКП: RES*IMG*DCT
для начала нужно посчитать промежуточную матрицу: TMP = IMG*DCT
|-103 -3 1 2 4 0 -1 5|
| 89 -40 12 -2 -7 5 1 0|
| 57 31 -30 6 2 0 5 0|
TMP = | 55 -28 24 1 0 -8 0 0|
| 32 -60 18 -1 14 0 -8 1|
| 84 -11 -37 17 -24 4 0 -4|
| 19 81 -16 -20 8 -3 4 0|
| 22 40 11 -22 8 0 -3 2|
затем умножаем ее на ДКП матрицу: RES = TMP*DCT
| 91 3 -5 -6 2 0 1|
|-38 -57 9 17 -2 2 2|
|-80 58 0 -18 4 3 4|
RES = |-52 -36 -11 13 -9 3 0|
|-86 -40 44 -7 17 -6 4|
|-62 64 -13 -1 3 -8 0|
|-16 14 -35 17 -11 2 -1|
|-53 32 -9 -8 22 0 2|
Этап 2. Квантование
На этом этапе мы посчитаем матрицу квантования, используя этот псевдокод:
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
Q[i][j] = 1+((1+i+j)*q);
}
где q - это коэффициент качества, задаваемый пользователем, от него зависит степень потери качества сжатого изображения. Величину этого коэффициента рекомендуется выбирать в диапазоне от1 до 25. большие значения коэффициента качества также возможны, однако при качество воспроизводимого изображения резко ухудшается.
Так для q = 2 имеем матрицу квантования:
| 3 5 7 9 11 13 15 17|
| 5 7 9 11 13 15 17 19|
| 7 9 11 13 15 17 19 21|
Q = | 9 11 13 15 17 19 21 23|
|11 13 15 17 19 21 23 25|
|13 15 17 19 21 23 25 27|
|15 17 19 21 23 25 27 29|
|17 19 21 23 25 27 29 31|
теперь нужно каждое число в матрице квантования разделить на число в соответствующей позиции в матрице RES, в результате получим:
| 30 0 0 0 0 0 0 0|
| -7 8 1 1 0 0 0 0|
|-11 6 0 1 0 0 0 0|
A = | -5 -3 0 0 0 0 0 0|
| -7 -3 2 0 0 0 0 0|
| -4 4 0 0 0 0 0 0|
| -1 0 1 0 0 0 0 0|
| -3 1 0 0 0 0 0 0|
как вы видите, здесь имеется довольно много нулей, мы получим наиболее длинную последовательность нулей, если будем использовать следующий алгоритм:
+----+----+----+----+----+----+----+----+
| 1 | 2 | 6 | 7 | 15 | 16 | 28 | 29 |
+----+----+----+----+----+----+----+----+
| 3 | 5 | 8 | 14 | 17 | 27 | 30 | 43 |
+----+----+----+----+----+----+----+----+
| 4 | 9 | 13 | 18 | 26 | 31 | 42 | 44 |
+----+----+----+----+----+----+----+----+
| 10 | 12 | 19 | 25 | 32 | 41 | 45 | 54 |
+----+----+----+----+----+----+----+----+
| 11 | 20 | 24 | 33 | 40 | 46 | 53 | 55 |
+----+----+----+----+----+----+----+----+
| 21 | 23 | 34 | 39 | 47 | 52 | 56 | 61 |
+----+----+----+----+----+----+----+----+
| 22 | 35 | 38 | 48 | 51 | 57 | 60 | 62 |
+----+----+----+----+----+----+----+----+
| 36 | 37 | 49 | 50 | 58 | 59 | 63 | 64 |
+----+----+----+----+----+----+----+----+
итак, у нас получилась последовательность:
30 0 -7 -11 8 0 0 1 6 -5 -7 -3 0 1 0 0 0 1 0 -3 -4 -1 4 2 0 0 0 0
0 0 0 0 0 0 0 -3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
для большего сжатия можно перед первым этапом JPEG можно провести субдискретизацию, или другими словами уменьшить частоту изображения,идея очень проста: к примеру у нас есть следующая последовательность
11 42 200 123 56 32 125 234 12 24 34 78 145 134 245 101
если будем использовать субдискретизацию 4:1:1 результирующая последовательность будет: 11 123 125 24 145 101
а если использовать 4:2:2 - 11 234 245
а для восстановления последовательности нужно интерполироать
Этап 3. Вторичное сжатие
На этом этапе можно применить следующий алгоритм 7bit RLE.Этот алгоритм очень прост. Если у нас есть последовательность одинаковых байтов, то нужно установить последний бит в 0, посчитать количество байт и записать в оставшиеся биты. Если у нас последовательность различных байтов, то нужно установить последний быт в 1, посчитать количество байт и записать его в оставшиеся биты. Для нашей последовательности получится:
133 30 0 -7 -11 8 | 2 0 | 135 1 6 -5 -7 -3 0 1 | 3 0 | 135 1 0 -3 -4 -1 4 2
11 0 | 131 -3 1 1 | 27 0
итак, мы сжали 64 байта в 34
5. Описание метода jpeg
Для обобщения опыта разработки и использования методов сжатия неподвижных полутоновых и цветных изображений и разработки международного стандарта МККТТ и МОС в 1991 году была создана организация, состоящая из группы экспертов, которая получила название JPEG (Join Photographic Expert Group). Разработанный ими стандарт алгоритма обработки изображений получил название JPEG, который определяет правила сжатия многоградационных как черно-белых, так и цветных и полутоновых изображений. Стандарт состоит из ряда частей, включающих как сжатие без потерь, так и с частичными искажениями преобразуемой информации. Компрессия без потерь базируется на основе ДИКМ с предсказанием, адаптивных алгоритмов Хаффмена или арифметического кодирования. Компрессия изображений с потерей использует метод косинусного преобразования с последующим квантованием.
Вносимые искажения информации при ее компрессии в соответствии в алгоритмом JPEG не должны приводить к заметному ухудшению качества восстанавливаемого изображения, в частности, качество изображения по сравнению с оригиналов должно оцениваться на «отлично» или «хорошо». Кроме этого метод должен быть достаточно простым в реализации.
Структура компрессора и декомпрессора видеоинформации по стандарту JPEG показана на рисунке 1:
Фрагмент изображения
Восстановленный фрагмент
Рисунок 1 - Структурная схема компрессора и декомпрессора по JPEG
Рассмотрим подробнее некоторые особенности процедуры обработки изображений JPREG. Кодируемое изображение разбивается на блоки размером 8*8 элементов (пикселей). Каждый блок представляет собой 64-точечный дискркетный сигнал, состоящий из последовательности целых чисел в диапазоне [0.. 2^k - 1], которые затем преобразовываются в знаковые числа диапазона [-2^k, 2^(k-1) - 1]. Так, при256 градациях яркости количество разрядов для кодирования отсчета изображения k=8. Яркость пикселя путем масштабирования переносится из интервала 0 - 255 в диапазон от -127 до 127.
Выходной сигнал блока FDCT представляет собой 64-элементный массив, организованный в матрицу 8*8. Амплитуды трансформант однозначно определяются исходным блоком отчетов видеосигнала, и представляет собой коэффициенты при дискретных частотах. Коэффициент при нулевой частоте определяет амплитуду постоянной составляющей (DC), а остальные коэффициенты - амплитуды переменных составляющих (AC). В связи с тем, что элементы изображения во входном блоке изменяются слабо, то за счет косинусного преобразования удается сгруппировать трансформанты в области нижних пространственных частот. Следует еще раз подчеркнуть, что косинусное преобразование является обратимым и не приводит к сжатия сообщения. Оно осуществляет только подготовку данных к процедуре сжатия, которая осуществляется в квантователе.
Целью квантования является компрессия изображения путем задания точности не большей, чем это необходимо для получения желаемого качества воспроизведения изображения. При сжатии трансформант можно снижать и точность квантования, причем тем больше, чем дальше расположена трансформанта от постоянной составляющей DC, находящейся в матрице с индексами (0,0). Снижение точности отображения трансформант уменьшает количество требуемых для их представления битов. Элементы, которые расположены ближе к постоянной составляющей, кодируются большим числом битов, а более удаленные - меньшим.
В алгоритме JPEG операция квантования реализуется с помощью матрицы квантования. Для каждого элемента матрицы трансформант имеется соответствующие ему значения кванта Q(i,j), расположенные в матрице квантования. Квантование осуществляется делением каждой трансформанты F(i,j) на соответствующий ей квант Q(i, j) и выделением целой части.
Fq(i, j) = [ F(i, j) / Q(i, j) ]
Значение Q(i, j) находится в диапазоне от 0 до 255. Величина Q(i, j)=1 обеспечивает наибольшую точность.По мере удаления от верхнего левого угла матрицы значение квантов увеличивается. Нетрудно заметить, что, начиная с некоторых значений, когда Q(i, j)> F(i, j) квантованное значение Fq(i, j) обращается в нуль, т.е. происходит невозвратимая потеря части информации. Несмотря на наличие стандартной таблицы квантов, JPEG предоставляет пользователям определенную свободу выбора элементов матрицы квантов в зависимости от желаемого качества воспроизведения. Предложено определять значения квантов по формуле
Q[ i, j ]=1+(1+i+j)*g,
Где i и j - индексы элементов матрицы квантов, при i,j=1,2,…,N; g-коэффициент качества воспроизведения изображения, задаваемого пользователем. Величину этого коэффициента рекомендуется выбирать в диапазоне от 1 до 25. Большие значения коэффициента качества также возможны, однако при этом качество воспроизводимого изображения резко ухудшается. В таблице представлена матрица квантов, рассчитанная при коэффициенте качества g=2.
Коэффициенты квантованияQ(i, j) |
||||||||
3 |
5 |
7 |
9 |
11 |
13 |
15 |
17 |
|
5 |
7 |
9 |
11 |
13 |
15 |
17 |
19 |
|
7 |
9 |
11 |
13 |
15 |
17 |
19 |
21 |
|
9 |
11 |
13 |
15 |
17 |
19 |
21 |
23 |
|
11 |
13 |
15 |
17 |
19 |
21 |
23 |
25 |
|
13 |
15 |
17 |
19 |
21 |
23 |
25 |
27 |
|
15 |
17 |
19 |
21 |
23 |
25 |
27 |
29 |
|
17 |
19 |
21 |
23 |
25 |
27 |
29 |
31 |
При деквантовании производится операция умножения, т.е.
F'(i, j) =Fq (i, j)* Q(i, j)
Величина F'(i,j) является входной для обратного косинусного преобразования. В, в качестве примера, приведены значения трансформант на выходе косинусного преобразователя произвольного фрагмента изображения, а в следующей таблице - значения на выходе квантователя. В связи с тем, что многие трансформанты приобретают нулевое значение, объем передаваемой информации существенно уменьшится.
Значения трансформант перед квантованием |
||||||||
92 |
3 |
-9 |
-7 |
3 |
-1 |
0 |
2 |
|
-39 |
-58 |
12 |
17 |
-2 |
2 |
4 |
2 |
|
-84 |
62 |
1 |
-18 |
3 |
4 |
-5 |
5 |
|
-52 |
-36 |
-10 |
14 |
-10 |
4 |
-2 |
0 |
|
-86 |
-40 |
49 |
-7 |
17 |
-6 |
-2 |
5 |
|
-62 |
65 |
-12 |
-2 |
3 |
-8 |
-2 |
0 |
|
-17 |
14 |
-36 |
17 |
-11 |
3 |
3 |
-1 |
|
-54 |
32 |
-9 |
9 |
22 |
0 |
1 |
3 |
|
Значения трансформант после деквантования |
||||||||
90 |
0 |
-7 |
0 |
0 |
0 |
0 |
0 |
|
-35 |
-56 |
9 |
11 |
0 |
0 |
0 |
0 |
|
-84 |
54 |
0 |
-13 |
0 |
0 |
0 |
0 |
|
-45 |
-33 |
0 |
0 |
0 |
0 |
0 |
0 |
|
-77 |
-39 |
45 |
0 |
0 |
0 |
0 |
0 |
|
-52 |
60 |
0 |
0 |
0 |
0 |
0 |
0 |
|
-15 |
0 |
-19 |
0 |
0 |
0 |
0 |
0 |
|
-51 |
19 |
0 |
0 |
0 |
0 |
0 |
0 |
Дальнейшим шагом JPEG-процедуры является кодирование квантованного изображения. Сначала разделяются трансформанты постоянной DC и переменной AC составляющих. Трансформанта постоянной составляющей является мерой среднего значения 63 отсчетов изображения. Так как соседние блоки изображения обычно имеют сильную корреляционную связь, то постоянная составляющая последующего блока в большинстве случаев мало отличается от DC - составляющей предыдущего блока. Она преобразуется из абсолютного значения в относительное, и затем кодируется приращение текущей DC - составляющей по отношению к предыдущей (ДИКМ).
Трансформанты переменных составляющих преобразуются в последовательность способом «Зигзаг». Последовательность трансформант AC можно считать методом кодирования длин повторяющихся символов (так как в образованной последовательности имеется большое число нулей), либо хаффменовским или арифметическим кодированием.
Схема считывания отсчетов фрагмента изображения
0.0 |
0.1 |
0.2 |
||||||
1.0 |
1.1 |
1.2 |
||||||
2.0 |
2.1 |
2.2 |
||||||
3.0 |
3.1 |
3.2 |
||||||
4.0 |
4.1 |
4.2 |
||||||
5.0 |
5.1 |
5.2 |
||||||
6.0 |
6.1 |
6.2 |
6.3 |
|||||
7.0 |
7.1 |
7.2 |
7.3 |
Для сжатия последовательности AC-трансформант фрагмента изображения рекомендуется использовать так называемое энтропийное кодирование. При этом способе амплитуды ненулевых АС - составляющих отображаются неравномерным кодом, не обладающим свойством разделимости кодовых комбинаций. Поэтому для их разделения перед каждой из комбинаций ставится индикатор, указывающий длину текущей кодовой комбинации. Длинные группы нулей, расположенные между ненулевыми трансформантами, сжимаются методом кодирования длин последовательности одинаковых символов. В соответствии с рекомендацией JPEG отрезки зигзаг-последовательности, состоящие из группы нулевых и одной ненулевой трансформант, кодируются двумя словами: СИМ1 и СИМ2. СИМ1 представлен одним байтом, старший полубайт которого указывает длину ряда нулевых трансформант кодируемого отрезка, а младший - размер (количество битов) второго символа СИМ2, отображающего амплитуду ненулевой трансформанты, завершающую отрезок последовательности нулевых трансформант. Очевидно, что полубайт может закодировать длину отрезка, состоящего из 1..15 нулевых трансформант. На практике длина отрезка может быть больше 15. В этом случае длинная последовательность нулей представляется СИМ1 (15,0), отображающим группу, состоящую из 16 нулей. Таких символов при величине кодируемого фрагмента изображения 8*8 может быть до 3-х. Затем следует СИМ2 с кодом длины, дополняющей последовательность до действительного числа нулевых трансформант. Значение символа СИМ1 с кодом (0,0) используется для индикации конца кодирования текущего фрагмента отсчетов размером 8*8 элементов. Для кодирования амплитуды ненулевых трансформант используются целые двоичные знаковые числа, содержащие различное число битов.
Количество битов |
Значение амплитуды |
|
1 |
-1,1 |
|
2 |
От -3 до -2, от 2 до 3 |
|
3 |
От-7 до -4, от 4 до7 |
|
4 |
От -15 до -8, от8 до 15 |
|
5 |
От -31 до -16, от 16 до 31 |
|
6 |
От -63 до -32, от 32 до 63 |
|
7 |
От -127 до -64, от 64 до 127 |
|
8 |
От -255 до -128, от 128 до 255 |
|
9 |
От -511 до -256, от 256 до 511 |
|
10 |
От -1023 до -512, от 512 до 1023 |
Каждая группа битов кодирует симметричный диапазон амплитуд, состоящий из положительных и отрицательных значений. Старший бит этих чисел отображает знак, а остальные - значение амплитуды. Постоянная составляющая трансформант DC также кодируется неравномерным кодом и представляется посредством двух символов. Первый символ СИМ1 указывает длину, а второй СИМ2 - амплитуду DC - составляющей. В связи с тем, что постоянные составляющие кодируются дифференциальным способом, диапазон их представления увеличивается вдвое и изменяется от -2^11 до 2^11-1. Поэтому добавляется дополнительная строка, а СИМ2 принимает значение от 0 до 11. Такой неравномерный код по степени сжатия несколько уступает хаффменскому или арифметическим кодам. Однако он значительно проще в реализации и является достаточно эффективным, когда большинство трансформант состоит из малых значений, что чаще всего наблюдается на практике.
В процессе исследований процедуры сжатия установлено, что кодовые комбинации СИМ1, отображающие длину нулевых последовательностей и амплитуду трансформант, характеризуются большой неравномерностью вероятности появления. Поэтому JPEG рекомендует производить дополнительное сжатие информации путем хаффменовского кодирования символов СИМ1.
Пример. Закодировать способом энтропийного кодирования проквантованные трансформанты блока, приведенного в таблице.
Значения трансформант после квантования |
||||||||
86 |
-5 |
3 |
0 |
0 |
2 |
0 |
1 |
|
12 |
-3 |
0 |
0 |
0 |
0 |
0 |
0 |
|
-1 |
17 |
0 |
0 |
0 |
2 |
0 |
0 |
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
|
0 |
21 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
7 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Последовательность значений трансформант:
86 -5 12 -1 -3 3 0 0 17 0 0 0 0 0 0 2 0 0 -1 0 21 0 0 0 0 0 0 0 0 -1 0 -2 0 0 0 0 0 0 -7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.
Используя описанный выше способ кодирования и данные таблицы, получим последовательность символов СИМ1 и СИМ2:
(7)(86) (0,3)(-5) (0,4)(12) (0,1)(-1) (0,2)(-3) (2,5)(17) (6,2)(2) (2,1)(-1) (0,5)(21) (8,1)(-1) (1,2)(-2) (6,3)(-7) (0,0)
jpeg полутоновое изображение сжатие компрессия
Рассмотренный JPEG-алгоритм относится к монохромным изображениям. Цветные изображения обычно состоят из трех компонент: красного, зеленого и синего цветов (RGB-формат сигнала). В этом случае JPEG-алгоритм рассматривает изображение так, как будто оно состоит из трех отдельных изображений. При RGB-изображении сначала сжимается красная, затем зеленая и в конце синяя компонента. Для каждой компоненты могут использоваться различные таблицы квантования и энтропийного кодирования, которые определяются статистическими характеристиками составляющих изображения. В процессе компрессии и декомпрессии осуществляется синхронное переключение таблиц в соответствии с обрабатываемой компонентой.
6. Тестирование программы
При тестировании программы получено полутоновое неподвижное изображение, которое находится на одном из окон программы. Субъективная оценка работы программы - «хорошо».
Заключение
Данная программа разработана в соответствии с постановкой задачи на курсовое проектирование по теме "Компрессия полутонового изображения" по дисциплине "Кодирование и защита информации" («КиЗИ»). При написании программы использованы методические указания по курсовому проектированию по дисциплине "КиЗИ". Интерфейс программы удобен для использования. Выходные данные представлены в виде полутонового неподвижного изображения на одном из окон программы. По своей структуре программа хорошо организована, что позволяет в случае необходимости легко ее модифицировать. Для проверки работоспособности программы и правильности обработки входных данных разработан тестовый пример. Тестирование программы подтвердило, что программа правильно выполняет обработку данных и выдаёт верные результаты.
Всё это свидетельствует о работоспособности программы и позволяет сделать вывод о пригодности программы к компрессии полутонового изображения и является наглядным примером программной реализации метода JPEG.
Библиографический список
1. В.С.Чернега Сжатие информации в компьютерных сетях: Учебное пособие для вузов: Под ред. д.т.н., проф. В.К. Маригодова.- Севастополь.: СевГТУ,- 1997.-214с.: ил.
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtDlgs, ExtCtrls, StdCtrls, Buttons, Spin, Grids;
type
{****}
TPImage=Record
bfType:Array[1..2] Of Char;
bfSize:Integer;
bfReserved:Integer;
bfOffBits:Integer;
biSize:Integer;
biWidth:Integer;
biHeight:Integer;
biPlanes:Word;
biBitCount:Word;
biCompression:Integer;
biSizeImage:Integer;
biXPelsPerMeter:Integer;
biYPelsPerMeter:Integer;
biClrUsed:Integer;
biClrImpotant:Integer
End;
{****}
TForm1 = class(TForm)
MainMenu1: TMainMenu;
OpenDialog1: TOpenDialog;
File1: TMenuItem;
Open1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Label27: TLabel;
Label29: TLabel;
Label30: TLabel;
Label28: TLabel;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Decompression: TSpeedButton;
Label31: TLabel;
Compression: TSpeedButton;
Edit1: TEdit;
Convert: TSpeedButton;
Quality: TSpinEdit;
Label32: TLabel;
Label33: TLabel;
procedure Open1Click(Sender: TObject);
procedure CompressionClick(Sender: TObject);
procedure DecompressionClick(Sender: TObject);
procedure ConvertClick(Sender: TObject);
procedure Exit1Click(Sender: TObject);
private
Procedure ToBinTo(Digit:SmallInt;N:ShortInt);
Procedure ToBin(Digit:SmallInt;N:ShortInt);
Procedure Int24ToInt3_8(Digit:Integer;x,y:ShortInt);
Procedure GetColor(x,y:ShortInt);
Procedure PutColor(x,y:ShortInt);
Procedure ConvertWrite(x,y:Integer);
Procedure ToCos;
Procedure CosTo;
Procedure TKwant;
Procedure ToKwant;
Procedure KwantTo;
Procedure TR(var x,y: Integer;S: ShortInt);
Procedure TD(var x,y: Integer;S: ShortInt);
Procedure TLD(var x,y: Integer;S: ShortInt);
Procedure TRU(var x,y: Integer;S: ShortInt);
Procedure Zigzag(Style: ShortInt);
Procedure Coding;
Procedure ChoiceAmp(Digit:SmallInt);
Procedure BinToSym1Dec;
Procedure BinToSym2Dec;
Procedure Decoding;
Procedure RabFileToLongInt;
Procedure LongIntToRabFile;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
PImage: TPImage;
clRGB: Array[0..7,0..7] Of Byte;
TOC: Array[0..7,0..7] Of Integer;
Zgzg: Array[0..63] Of Integer;
T: Array[0..7,0..7] Of Integer;
TKW: Array[0..7,0..7] Of Integer;
RabF: TextFile;
Posit: Byte;
Sym11,Sym12,Sym2: Integer;
DcD: Array [0..191] Of Integer;
RabFile: String;
SizeRabFile: Integer;
prf: integer;
BinA: String;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Exit1Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Open1Click(Sender: TObject);
Var F:File;
i,j:integer;
red: Byte;
begin
If OpenDialog1.Execute Then Begin
AssignFile(F,OpenDialog1.FileName);
Reset(F,1);
With PImage Do Begin
BlockRead(F,bfType,SizeOF(bfType));
Form1.Label16.Caption:=bfType;
BlockRead(F,bfSize,SizeOF(bfSize));
Form1.Label17.Caption:=IntToStr(bfSize)+' bytes';
BlockRead(F,bfReserved,SizeOF(bfReserved));
Form1.Label18.Caption:=IntToStr(bfReserved);
BlockRead(F,bfOffBits,SizeOF(bfOffBits));
Form1.Label19.Caption:=IntToStr(bfOffBits)+' bytes';
BlockRead(F,biSize,SizeOF(biSize));
Form1.Label20.Caption:=IntToStr(biSize);
BlockRead(F,biWidth,SizeOF(biWidth));
Form1.Label21.Caption:=IntToStr(biWidth);
BlockRead(F,biHeight,SizeOF(biHeight));
Form1.Label22.Caption:=IntToStr(biHeight);
BlockRead(F,biPlanes,SizeOF(biPlanes));
Form1.Label23.Caption:=IntToStr(biPlanes);
BlockRead(F,biBitCount,SizeOF(biBitCount));
Form1.Label24.Caption:=IntToStr(biBitCount);
BlockRead(F,biCompression,SizeOF(biCompression));
Form1.Label25.Caption:=IntToStr(biCompression);
BlockRead(F,biSizeImage,SizeOF(biSizeImage));
Form1.Label26.Caption:=IntToStr(biSizeImage);
BlockRead(F,biXPelsPerMeter,SizeOF(biXPelsPerMeter));
Form1.Label27.Caption:=IntToStr(biXPelsPerMeter);
BlockRead(F,biYPelsPerMeter,SizeOF(biYPelsPerMeter));
Form1.Label28.Caption:=IntToStr(biYPelsPerMeter);
BlockRead(F,biClrUsed,SizeOF(biClrUsed));
Form1.Label29.Caption:=IntToStr(biClrUsed);
BlockRead(F,biClrImpotant,SizeOF(biClrImpotant));
Form1.Label30.Caption:=IntToStr(biClrImpotant);
red:=0;
For i:=1 to biWidth do Begin
For j:=1 to biHeight do
Form2.Image1.Canvas.Pixels[j,i]:= (red or Form2.Image1.Canvas.Pixels[j,i]);
end;
End;
CloseFile(F);
Compression1.Enabled:=True;
Form2.Width:=PImage.biWidth+10;
Form2.Height:=PImage.biHeight+10;
Form2.Image1.Picture.LoadFromFile(Form1.OpenDialog1.FileName);
Form2.Image1.Width:=PImage.biWidth+6;
Form2.Image1.Height:=PImage.biHeight+23;
Form2.Visible:=True;
End
end;
{***********************************************************}
procedure TForm1.ConvertWrite(x,y:Integer);
var i,j: integer;
begin
for i:=0 to 7 do begin
for j:=0 to 7 do begin
Form2.Image1.Canvas.Pixels[x*8+i,y*8+j]:=RGB(clRGB[i,j],clRGB[i,j],clRGB[i,j]);
end;
end;
end;
procedure TForm1.ConvertClick(Sender: TObject);
var i,j,x,y: integer;
red: Byte;
begin
For x:=0 To Trunc((PImage.biWidth+1)/8) Do
For y:=0 To Trunc((PImage.biHeight+1)/8) Do
Begin
GetColor(x,y);
ConvertWrite(x,y);
End;
Form2.Image1.Picture.SaveToFile('c:\ConvertFile.bmp');
end;
{***********************************************************}
{***********************************************************}
Procedure TForm1.Int24ToInt3_8(Digit:Integer;x,y:ShortInt);
Var i,j:ShortInt;
k:Byte;
Begin
k:=0;
For j:=0 To 7 Do Begin IF (Digit Mod 2)=1 Then k:=k+Trunc(exp(j*Ln(2)));
Digit:=Digit Div 2
End;
clRGB[x,y]:=k
End;
Procedure TForm1.GetColor(x,y:ShortInt);
Var i,j:ShortInt;
Begin
For i:=0 To 7 Do
For j:=0 To 7 Do Int24ToInt3_8(Form2.Image1.Canvas.Pixels[i+x*8,j+y*8],i,j)
End;
Procedure TForm1.PutColor(x,y:ShortInt);
Var i,j:ShortInt;
Begin
For i:=0 To 7 Do
For j:=0 To 7 Do Form2.Image1.Canvas.Pixels[i+x*8,j+y*8]:=RGB(TOC[i,j],TOC[i,j],TOC[i,j])
End;
Procedure TForm1.ToCos;
Var i,j,x,y:ShortInt;
s,d:Real;
Begin
For i:=0 To 7 Do
For j:=0 To 7 Do
Begin
s:=0;
If (i>0) And (j>0) Then d:=1
Else If (i=0) And (j=0) Then d:=1/2
Else d:=1/Sqrt(2);
For x:=0 To 7 Do
For y:=0 To 7 Do s:=s+clRGB[x,y]*Cos((2*x+1)*i*Pi/16)*Cos((2*y+1)*j*Pi/16);
TOC[i,j]:=Trunc(s*d/4)
End
End;
Procedure TForm1.CosTo;
Var i,j,x,y:ShortInt;
s,d:Real;
Begin
For x:=0 To 7 Do
For y:=0 To 7 Do
Begin
s:=0;
For i:=0 To 7 Do
For j:=0 To 7 Do
Begin
If (i>0) And (j>0) Then d:=1
Else If (i=0) And (j=0) Then d:=1/2
Else d:=1/Sqrt(2);
s:=s+d*TOC[i,j]*Cos((2*x+1)*i*Pi/16)*Cos((2*y+1)*j*Pi/16)
End;
T[x,y]:=Round(s/4)
End;
For i:=0 To 7 Do
For j:=0 To 7 Do TOC[i,j]:=T[i,j]
End;
Procedure TForm1.TKwant;
Var i,j:Byte;
Begin
For i:=0 To 7 Do
For j:=0 To 7 Do TKW[i,j]:=1+((1+i+j)*Form1.Quality.Value);
End;
Procedure TForm1.ToKwant; //Квантователь
Var i,j:Byte;
Begin
For i:=0 To 7 Do
For j:=0 To 7 Do TOC[i,j]:=Trunc(TOC[i,j]/TKW[i,j])
End;
Procedure TForm1.KwantTo; //Деквантователь
Var i,j:Byte;
Begin
For i:=0 To 7 Do
For j:=0 To 7 Do TOC[i,j]:=TOC[i,j]*TKW[i,j]
End;
{***********************************************************}
Procedure TForm1.TR(var x: Integer;var y: Integer;S: ShortInt);
Begin
inc(x);
inc(Posit);
If S=1 Then Zgzg[Posit]:=TOC[x,y]
Else TOC[x,y]:=DcD[Posit];
end;
Procedure TForm1.TD(var x: Integer;var y: Integer;S: ShortInt);
Begin
inc(y);
inc(Posit);
If S=1 Then Zgzg[Posit]:=TOC[x,y]
Else TOC[x,y]:=DcD[Posit];
end;
Procedure TForm1.TLD(var x: Integer;var y: Integer;S: ShortInt);
Begin
inc(y);
dec(x);
inc(Posit);
If S=1 Then Zgzg[Posit]:=TOC[x,y]
Else TOC[x,y]:=DcD[Posit];
end;
Procedure TForm1.TRU(var x: Integer;var y: Integer;S: ShortInt);
Begin
inc(x);
dec(y);
inc(Posit);
If S=1 Then Zgzg[Posit]:=TOC[x,y]
Else TOC[x,y]:=DcD[Posit];
end;
Procedure TForm1.Zigzag(Style: ShortInt);
Var i,j:Integer;
Begin
i:=0;
j:=0;
Posit:=0;
If Style=1 Then Zgzg[Posit]:=TOC[i,j]
Else TOC[i,j]:=DcD[Posit];
TR(i,j,Style);
While (i<7) and (j>=0) do
Begin
While i<>0 do TLD(i,j,Style);
TD(i,j,Style);
While j<>0 do TRU(i,j,Style);
TR(i,j,Style)
end;
While (i<=7) And (j<6) do
Begin
While j<>7 do TLD(i,j,Style);
TR(i,j,Style);
While i<>7 do TRU(i,j,Style);
TD(i,j,Style);
end;
TLD(i,j,Style);
TR(i,j,Style);
End;
Procedure TForm1.ToBinTo(Digit:SmallInt;N:ShortInt);
Var i,k:ShortInt;
Nol: Array [0..15] of Integer;
Begin
For i:=0 To N-1 Do Begin k:=Digit Mod 2;
Nol[i]:=k;
Digit:=Digit Div 2
End;
For i:=N-1 DownTo 0 do BinA:=BinA+IntToStr(Nol[i]);
RabFile:=RabFile+BinA;
End;
Procedure TForm1.ToBin(Digit:SmallInt;N:ShortInt);
Var i,k:ShortInt;
p:SmallInt;
Begin
BinA:='';
p:=Digit;
i:=1;
k:=0;
If p<0 Then BinA:=BinA+IntToStr(i)
Else BinA:=BinA+IntToStr(k);
Digit:=Abs(Digit);
ToBinTo(Digit,N-1); BinA:='';
End;
Procedure TForm1.ChoiceAmp(Digit:SmallInt);
Begin
Case Digit Of
-1,0..1:Begin ToBinTo(2,4); ToBin(Digit,2) End;
-3..-2,2..3:Begin ToBinTo(3,4); ToBin(Digit,3) End;
-7..-4,4..7:Begin ToBinTo(4,4); ToBin(Digit,4) End;
-15..-8,8..15:Begin ToBinTo(5,4); ToBin(Digit,5) End;
-31..-16,16..31:Begin ToBinTo(6,4); ToBin(Digit,6) End;
-63..-32,32..63:Begin ToBinTo(7,4); ToBin(Digit,7) End;
-127..-64,64..127:Begin ToBinTo(8,4); ToBin(Digit,8) End;
-255..-128,128..255:Begin ToBinTo(9,4); ToBin(Digit,9) End;
-511..-256,256..511:Begin ToBinTo(10,4); ToBin(Digit,10) End;
-1024..-512,512..1024:Begin ToBinTo(11,4); ToBin(Digit,11) End
End
End;
Procedure TForm1.Coding;
Var ZeroCounter: Integer;
n: Integer;
Begin
RabFile:='';
Zigzag(1);
ZeroCounter:=0;
For n:=0 to 63 Do Begin BinA:='';
If Zgzg[n]=0 Then Begin
Inc(ZeroCounter);
if ZeroCounter=15 Then
Begin
ToBinTo(15,4); BinA:='';
ToBinTo(0,4); BinA:='';
ZeroCounter:=0;
end
end
Else begin
ToBinTo(ZeroCounter,4); BinA:='';
ChoiceAmp(Zgzg[n]); BinA:='';
ZeroCounter:=0;
end;
end;
If ZeroCounter<>0 Then
Begin
ToBinTo(ZeroCounter,4); BinA:='';
ToBinTo(0,4); BinA:='';
ZeroCounter:=0;
End
end;
{***********************************************************}
Procedure TForm1.BinToSym1Dec;
Var
k,i: ShortInt;
S: String;
Nol: Array [0..3] of Integer;
Begin
Sym11:=0;
Sym12:=0;
For i:=0 To 3 Do
Nol[i]:=StrToInt(RabFile[i+prf]);
inc(prf,4);
For i:=3 DownTo 0 do Begin
k:=Nol[i];
If k=1 Then Inc(Sym11,Trunc(exp((3-i)*Ln(2))))
End;
For i:=0 To 3 Do
Nol[i]:=StrToInt(RabFile[i+prf]);//Read(F,k);
inc(prf,4);
For i:=3 DownTo 0 do Begin
k:=Nol[i];
If k=1 Then Inc(Sym12,Trunc(exp((3-i)*Ln(2))))
End;
//inc(prf);
end;
Procedure TForm1.BinToSym2Dec;
Var k,i: ShortInt;
Mark: Byte;
Nol: Array [0..15] of integer;
Begin
If Sym12<>0 Then
Begin
k:=StrToInt(RabFile[prf]);//Read(F,k);
inc(prf);
Mark:=k;
Sym2:=0;
For i:=0 To Sym12-2 Do
Nol[i]:=StrToInt(RabFile[i+prf]);//Read(F,k);
inc(prf,Sym12-1);
For i:=Sym12-2 DownTo 0 do Begin
k:=Nol[i];
If k=1 Then Inc(Sym2,Trunc(exp((Sym12-2-i)*Ln(2))))
End;
// Inc(prf);
If Mark=1 Then Sym2:=-Sym2;
End
Else Sym2:=0;
// Inc(prf);
end;
Procedure TForm1.Decoding;
Var i:Byte;
Begin
prf:=1;
For i:=0 to 191 do DcD[i]:=0;
i:=0;
While i< 64 do
Begin
BinToSym1Dec;
BinToSym2Dec;
//DcD[i]:=Sym11;
//DcD[i+1]:=Sym12;
If Sym11=0 Then i:=i+1
Else If Sym11=15 Then i:=i+Sym11
Else i:=i+1+Sym11;
DcD[i-1]:=Sym2;
end;
Zigzag(0);
end;
{***********************************************************}
procedure TForm1.RabFileToLongInt;
Var o,k,i,j,n: Integer;
Longg: String;
Lon: LongInt;
WW: Array [1..64] of String;
Nol: Array [1..64] of Integer;
Begin
For i:=1 to 64 do WW[i]:='';
Lon:=0;
Writeln(RabF,IntToStr(Length(RabFile)));
o:=Length(RabFile) Mod 24;
k:=Trunc(Length(RabFile)/24);
If o>0 Then inc(k);
Writeln(RabF,IntToStr(k));
For j:=1 to k do
For i:=(24*j)-23 to 24*j do
begin
if i>=length(rabfile) then ww[j]:=ww[j]+'0'
else
WW[j]:=WW[j]+RabFile[i];
end;
For j:=1 to k do Begin Lon:=0;
For i:=1 to 24 do Nol[i]:=StrToInt(WW[j][i]);
For i:=24 DownTo 1 do Begin
n:=Nol[i];
If n=1 Then Inc(Lon,Trunc(exp((24-i)*Ln(2))))
end;
// Form1.Memo1.Lines.Add(IntToStr(Lon));
Writeln(RabF,IntToStr(Lon));
end
end;
Procedure TForm1.LongIntToRabFile;
Var k,i,j: Integer;
Nol: Array [0..23] of Integer;
Digit: LongInt;
LengthRabFile, Kol:Integer;
DigitS,R: String;
Begin
j:=0; RabFile:='';
readln(RabF,LengthRabFile);
readln(RabF,Kol);
For i:=1 to 24 do Nol[i]:=0;
While j<Kol do begin
BinA:='';
readln(RabF,DigitS);
Digit:=StrToInt(DigitS);
For i:=0 To 23 Do Begin k:=Digit Mod 2;
Nol[i]:=k;
Digit:=Digit Div 2
End;
For i:=23 DownTo 0 do BinA:=BinA+IntToStr(Nol[i]);
R:=R+BinA;
Inc(j);
end;
For i:=1 to LengthRabFile do
RabFile:=RabFile+R[i];
end;
{***********************************************************}
procedure TForm1.CompressionClick(Sender: TObject);
var x,y,i,j: integer;
k:Byte;
begin
AssignFile(RabF,Form1.Edit1.Text);
ReWrite(RabF);
Writeln(RabF,PImage.biWidth);
Writeln(RabF,PImage.biHeight);
//ToBinTo(PImage.biWidth,12);
//ToBinTo(PImage.biHeight,12);
TKwant;
// ShowMessage('Наберитесь терпения');
For x:=0 To Trunc((PImage.biWidth+1)/8)-1 Do
For y:=0 To Trunc((PImage.biHeight+1)/8)-1 Do
Begin
GetColor(x,y);
ToCos;
ToKwant;
Coding;
// RabFileToLongInt;
KwantTo;
CosTo;
PutColor(x,y);
RabFileToLongInt;
End;
CloseFile(RabF)
end;
procedure TForm1.DecompressionClick(Sender: TObject);
Var x,y,i,k:Word;
j:ShortInt;
W,H: Integer;
begin
RabFile:='';//OpenDialog1.Filter:='Файлы для декомпресии (*.Zo)|*.Zo';
If OpenDialog1.Execute Then
Begin
Form2.Visible:=True;
TKwant;
AssignFile(RabF,OpenDialog1.FileName);
Reset(RabF);
{ k:=0;
For i:=0 To 11 Do Begin Read(F,j); If j=1 Then Inc(k,Trunc(exp(j*ln(2)))) End;
Form2.Width:=k+6;
k:=0;
For i:=0 To 11 Do Begin Read(F,j); If j=1 Then Inc(K,Trunc(exp(j*ln(2)))) End;
Form2.Height:=k+23; }
Form2.Top:=120;
Form2.Left:=120;
Readln(RabF,W);
Readln(RabF,H);
Form2.Image1.Width:=W;
Form2.Image1.Height:=H;
Form2.Width:=W+10;
Form2.Height:=H+10;
// ShowMessage('Наберитесь терпения');
For x:=0 To Trunc((Form2.Image1.Width)/8)-1 Do
For y:=0 To Trunc((Form2.Image1.Height)/8)-1 Do
Begin
LongIntToRabFile;
Decoding;
KwantTo;
CosTo;
PutColor(x,y)
End;
CloseFile(RabF)
End
end;
{procedure TForm1.SpeedButton1Click(Sender: TObject);
var i,j,s: Integer;
Trpr,Trpr1,Trpr2,Trpr3,Trpr4: String;
begin
AssignFile(RabF,'c:\Abracadabra.txt');
Rewrite(RabF);
Form1.Top:=0;
Form1.Left:=0;
// Form1.Memo1.Lines.Add('***TOC******');
Trpr:='';
Trpr1:='';
s:=1;
For i:=0 To 7 do
For j:=0 To 7 do Begin
TOC[i,j]:=0;
Inc(s);
// If i+j=5 Then TOC[i,j]:=i+1;
If s<53 Then TOC[i,j]:=s;
Trpr:=Trpr+' '+IntToStr(TOC[i,j]);
end;
{ For i:=0 To 7 do
For j:=0 To 7 do Begin
TOC[i,j]:=s;
If s<45 Then s:=s+1;
Trpr:=Trpr+' '+IntToStr(TOC[i,j]);
end; }
{ Form1.Memo1.Lines.Add(Trpr);
Form1.Memo1.Lines.Add('***Zgzg******');
Coding;
For i:=0 to 63 do Trpr1:=Trpr1+' '+IntToStr(Zgzg[i]);
Form1.Memo1.Lines.Add(Trpr1);
Form1.Memo1.Lines.Add('***RabFile******'+'prf'+IntToStr(prf));
Form1.Memo1.Lines.Add(RabFile);
RabFileToLongInt;
{ Form1.Memo1.Lines.Add('***DcD******');
Decoding;
For i:=0 to 63 do Trpr2:=Trpr2+' '+IntToStr(DcD[i]);
Form1.Memo1.Lines.Add(Trpr2);
Form1.Memo1.Lines.Add('***NewTOC******');
For i:=0 To 7 do
For j:=0 To 7 do
Trpr3:=Trpr3+' '+IntToStr(TOC[i,j]);
Form1.Memo1.Lines.Add(Trpr3);
Form1.Memo1.Lines.Add('***Длина RabFile******');
Form1.Memo1.Lines.Add(IntToStr(Length(RabFile)));
{ Form1.Memo1.Lines.Add('***RabFile в LongInt******');
RabFileToLongInt;
// Form1.Memo1.Lines.Add('***NewRabFile******');
// LongIntToRabFile;
// Form1.Memo1.Lines.Add(NewRabFile); }
{ CloseFile(RabF);
// Zigzag;
// for s:=0 to 63 do Form1.Memo1.Lines.Add(IntToStr(Zgzg[s]));}
{end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
var i,j,s: Integer;
Trpr,Trpr1,Trpr2,Trpr3,Trpr4: String;
begin
{ BinA:='';
a:= StrToInt(Form1.LabeledEdit2.Text);
ToBinTo(a,8);
Form1.LabeledEdit1.Text:=BinA;}
{ AssignFile(RabF,'c:\Abracadabra.txt');
Reset(RabF);
LongIntToRabFile;
Form1.Memo1.Lines.Add('***NewRabFile******');
Form1.Memo1.Lines.Add(RabFile);
Form1.Memo1.Lines.Add('***DcD******');
Decoding;
For i:=0 to 63 do Trpr2:=Trpr2+' '+IntToStr(DcD[i]);
Form1.Memo1.Lines.Add(Trpr2);
Form1.Memo1.Lines.Add('***NewTOC******');
For i:=0 To 7 do
For j:=0 To 7 do
Trpr3:=Trpr3+' '+IntToStr(TOC[i,j]);
Form1.Memo1.Lines.Add(Trpr3);
end;}
end.
object Form2: TForm2
Left = 416
Top = 233
AutoScroll = False
Caption = #1043#1083#1103#1085#1100' '#1085#1072' '#1084#1077#1085#1103
ClientHeight = 304
ClientWidth = 307
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 64
Top = 40
Width = 185
Height = 161
AutoSize = True
end
end
Размещено на Allbest.ru
Подобные документы
Разработка приложения, целью которого ставится преобразование черно-белых полутоновых изображений в цветные. Обзор методики обработки изображения, способов преобразования изображения с помощью нейронной сети. Описания кластеризации цветового пространства.
дипломная работа [6,3 M], добавлен 17.06.2012Информация о графических форматах. Хранение изображения в программе. Очередь как вспомогательная структура данных. Загрузка изображения из двоичного файла. Операции с изображением. Уменьшение разрешающей способности. Увеличение размера изображения.
курсовая работа [1,1 M], добавлен 29.06.2013Методы кодирования изображения: кодированием длины серии, частотно-зависимое кодирование, метод Лемпеля-Зива. Размер строки при 16-битном цвете. Расчет размера всего исходного изображения. Примеры качественного и некачественного сжатия изображения.
презентация [2,0 M], добавлен 22.10.2013Описание алгоритма поворота изображения. Вычисление синуса и косинуса угла поворота изображения. Алгоритм и реализация функции поворота изображения вокруг центра на заданный пользователем угол. Проверка на соответствие диапазону допустимых значений.
курсовая работа [1,3 M], добавлен 23.01.2015Описание этапов создания анимированного GIF изображения мультипликационного героя "Винни-Пуха" в программе Adobe Photoshop CS6. Создание дубликата слоя изображения и подготовка кадров для GIF анимации. Настройка эффектов анимации и результат GIF-файла.
лабораторная работа [1,2 M], добавлен 05.03.2015Интерфейс программы Adobe Photoshop. Внесение изменений в изображение. Инструменты изменения оттенка и искажения изображения. Последовательность формирования изображения. Тоновая и цветовая коррекция изображения, работа с фильтрами и функциями.
курсовая работа [2,8 M], добавлен 14.12.2011Задачи цифровой обработки изображений. Методы пороговой сегментации. Создание программы представления рисунка в виде матрицы и применения к нему пороговой обработки. Разработка интерфейса программы загрузки и фильтрации изображения с выбранным порогом.
курсовая работа [2,0 M], добавлен 12.11.2012Задача зеркального отражения изображения как одна из подзадач многих программ. Анализ создания программы, выполняющей зеркальное отображение изображения, который хранится в файле формата .pcx (256 цветов). Проектирование пользовательского интерфейса.
курсовая работа [625,6 K], добавлен 17.05.2013Архив – файл с информацией из одного или нескольких сжатых файлов. Теоретические основы сжатия данных: объекты, обратимость; программные средства и требования к ним. Архиваторы под Windows: WinZip, WinRar; поддержка алгоритмов компрессии JPEG, LZMA.
реферат [18,4 K], добавлен 30.11.2011Фильтрация шумов изображения. Алгоритмы его бинаризации и поворота. Формирование информативных признаков для распознавания нот. Схема программного обеспечения. Описание классов, функций, методов, реализованных в программе. Тестирование приложения.
курсовая работа [2,0 M], добавлен 17.12.2013