Научный руководитель С.И.Хашин
На сегодняшний день наиболее эффективный способ хранения двухцветных (черно-белых, black-white, b/w) изображений - сохранить их в формате png.
Однако, png - это универсальный формат, он не настроен специально на сжатие именно двухцветных изображений. Это дает нам шанс превзойти сжатие, даваемое форматом png.
Разработанный нами алгоритм состоит из двух этапов:
1. Для данной точки на изображении находим среди «предыдущих» точек
ту, область после которой наиболее «похожа» на область после данной точки.
В выходной поток отправляем 4 числа: две координаты смещения и размеры по
x и по y совпадающей области.
Опуская некоторые детали, на выходе 1-го этапа получаем поток из четверок
целых чисел: (offset_x, offset_y, dx, dy).
2. Сжимаем полученный поток числе с помощью архиватора bzip2.
Работа выполнена на языке C++.
#include "hlib.h" #include "iMatrix.h" #include "vUtil.h" //------------------------------------------------------------------------------ // В матрице a рассмотрим прямоугольники (x0..x0+dx-1,y0..y0+dy-1), (x1..x1+dx-1,y1..y1+dy-1) // Будем из называеть СОВПАДАЮЩИМИ, если значения матрицы в соответствующих точках одинаковы. // пара прямоугольников описывается шестью числами: (x0,y0),(x1,y1),(dx,dy) //------------------------------------------------------------------------------ // // Даны: матрица a, и совпадающие прямоугольники (x0,y0),(x1,y1),(dx,dy). // Можно ли их расширить на 1 ВПРАВО? bool Is_Expanded_Right(matr &a, int x0, int y0, int x1, int y1, int dx, int dy) { int mx=a.Mx(); if (y1==y0) { if((x1+dx==x0)||(x0+dx==mx)) return false; } else { if( (x0+dx==mx) || (x1+dx==mx) ) return false; } // дошли до правого края, расширять некуда for( int i=0; imax_s ) { dx=dx_; dy=dy_; max_s=s; }; // если площадь увеличилась, запоминим ее } return max_s; } //********************************************************** /* Данная функция непосредственно обрабатывает считанное изображение, используя написанные ранее функции. Теперь проходим по всем элементам матрицы, и для всех точек, кроме данной, вычисляем максимальную площадь совпавшего прямоугольника. Сравнивая эти площади, выбираем наибольшую. При этом сохраняется не только значение площади, но и высота и длина полученного прямоугольника. Для данной функции используются следующие данные mx-ширина исходного изображения my-высота исходного изображения x и y - координаты данной точки(для окрестности которой ищется совпадение) &matrix-адрес переменной, в которой хранится информация о считанном изображении *x1 и *y1 - в эти переменные после обработки сохраняются координаты полученной точки *height и *width - высота и ширина полученной области, полученные после обработки всего изображения */