Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2010, 21:53   #1
EVG!
Новичок
Джуниор
 
Регистрация: 21.11.2010
Сообщений: 2
Восклицание Фрактальное сжатие изображений.

Хочется последовательно обсудить реализацию фрактального алгоритма кодирования ЦВЕТНЫХ изображений.
Пункт 1. Перевод изображения из RGB в YUV.
Y = 0.299 * R + 0.587 * G + 0.114 * B;
U = -0.14713 * R - 0.28886 * G + 0.436 * B;
V = 0.615 * R - 0.51499 * G - 0.10001 * B;
С формулами все ясно. А вот насчет той груды груды информации (Y, U, V для каждого пиксела) которую надо будет жранить для последующей обработки возникают вопросы.
Первое, что пришло на ум:
1. Изображение загружаем в БитМан bm;
2. Для хранения Y,U,V создаем
Код:
Type
    colorYUV = Record
    Y, U ,V : real;
    end;
3. Создаем список для хранения указателей на colorYUV:
Код:
ListYUV:=TList.Create;
4. Объявляем R: ^colorYUV и далее для каждого пиксела:
Код:
New(R);
R^.Y:=0.299*getRValue(bm.Canvas.Pixels[i,j])+
           0.587*getGValue(bm.Canvas.Pixels[i,j])+
           0.114*getBValue(bm.Canvas.Pixels[i,j]);
R^.U:=-0.14713*getRValue(bm.Canvas.Pixels[i,j])-
           0.28886*getGValue(bm.Canvas.Pixels[i,j])+
           0.43600*getBValue(bm.Canvas.Pixels[i,j]);
R^.V:=0.61500*getRValue(bm.Canvas.Pixels[i,j])-
          0.51499*getGValue(bm.Canvas.Pixels[i,j])-
          0.10001*getBValue(bm.Canvas.Pixels[i,j]);
ListYUV.Add(R);
Как на Ваш взгляд все это дело упростить и сделать более грамотно?
Если же все так и оставить, то как грамотнее реализовать следующий шаг разбиение изображения в YUV сеткой 8 на 8, с условием что каждый квадрат легко можно было бы подвергнуть аффинным преобразованиям?
EVG! вне форума Ответить с цитированием
Старый 22.11.2010, 01:02   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
2. Для хранения Y,U,V создаем
Ну в принципе можно и в битмап запихнуть, если округлить до целого (если можно с потерями)...
Цитата:
3. Создаем список для хранения указателей на colorYUV
Эм... А чем массив не угодил-то?
Цитата:
разбиение изображения в YUV сеткой 8 на 8
Хм... Ну тогда массив массивов по 64 пикселей...
Цитата:
с условием что каждый квадрат легко можно было бы подвергнуть аффинным преобразованиям?
Получается всё-таки придётся использовать числа с плавающей запятой... Скорость выполнения таки-упадёт...

А можно где-то сам алгоритм взглянуть по которому делаете?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 22.11.2010, 17:17   #3
EVG!
Новичок
Джуниор
 
Регистрация: 21.11.2010
Сообщений: 2
По умолчанию

Спасибо за развернутый ответ.
Немного о самом алгоритме:
Сначала берется исходное изображение, и разбивается равномерной сеткой 8*8 на регионы.
Далее подготавливается доменное изображение. Оно меньше, чем исходное в 4 раза (по площади). Доменное изображение разбивается на домены (8*8).
Размер доменов равен размеру регионов. НО! ДОМЕНЫ МОГУТ ПЕРЕКРЫВАТЬСЯ! (перекрытие задается пользователем, чаще всего 50%)
Процесс фрактального сжатия заключается в поиске самоподобных областей. В нашем случае последовательно перебираются все регионы, и для каждого региона определяется наиболее похожий на него домен. Применяется не только простое попиксельное сравнение региона с доменом, но и аффинные преобразования. Используются следующие аффинные преобразования:
1) поворот на 0 градусов (с технической точки зрения – тоже вариант)
2) поворот на 90 градусов
3) поворот на 180 градусов
4) поворот на 270 градусов
5) симметрия относительно оси Х
6) симметрия относительно оси У
7) симметрия относительно главной диагонали
8) симметрия относительно второстепенной диагонали
Итак, аффинные преобразования можно выполнять как над регионами, так и над доменами. Однако аффинные преобразования над доменами будут выполняться дольше, чем над регионами, так как в процессе сжатия регионы перебираются всего 1 раз, а домены – много раз (для каждого региона по разу). Таким образом, аффинные преобразования следует выполнять над регионами.
В общем, в процессе сжатия последовательно перебираются все регионы, для каждого региона последовательно перебираются все домены, которые в свою очередь сравниваются со всеми аффинными преобразованиями текущего региона.
Изображения сравниваются по пикселям.
Самый лучший домен тот, у которого окажется самым минимальным выражение:
СуммаПоI_CуммаПОJ(s*dij+o-rij)^2,
где s=СуммаПоI_CуммаПОJ((dij-d)*(rij-r))/СуммаПоI_CуммаПОJ((dij-d)^2)
o=r-s*d;
r,d - средние значения для регионов и доменов.
Итак, после того, как для текущего региона (со всеми аффинными преобразованиями) был найден наиболее схожий с ним домен, необходимо запомнить следующие данные:
- координаты домена (относительно доменного изображения);
- номер аффинного преобразования (2-е и 4-е аффинное преобразование следует поменять местами, так как при распаковке изображения аффинные преобразования нужно будет выполнять не над регионами, а над доменами);
- s, o;
- количество регионов по гор-ли и повертикали.
EVG! вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сжатие данных Horknee Свободное общение 18 10.05.2010 11:21
Производительность и сжатие изображений (аналог Radmin) elja_1989 Win Api 2 22.03.2010 14:44
сжатие фотографий AnKor94 Общие вопросы Delphi 1 15.03.2010 00:18
Сжатие битмапа Rapid Мультимедиа в Delphi 7 08.12.2007 16:38
Проверка на сжатие vitalik007 Общие вопросы Delphi 3 20.08.2007 10:53