В вашем коде небольшая ошибка. Я предполагаю, что вы хотите рассчитать вероятность столкновения каждого пикселя, который является нормированной гистограммой. Вы не правильно его вычисляете. В частности:
count = [0:1:255]; % Distinct data symbols appearing in sig
total=sum(count);
for i=1:1:size((count)');
p(i)=count(i)/total;
end
total
подытоживает над [0,255]
, которая не является правильным. Вы должны вычислить распределение вероятности вашего изображения. Вместо этого вы должны использовать imhist
. Таким образом, вы должны сделать это вместо этого:
count = imhist(A1);
p = count/numel(A1);
Это правильно рассчитает распределение вероятности вашего изображения. Помните, что когда вы делаете кодировку Хаффмана, вам нужно указать вероятность столкновения с пикселем. Предполагая, что каждый пиксель может в равной степени быть выбранным, его можно захватить, вычислив гистограмму изображения, а затем нормализуя общее количество пикселей на вашем изображении. Попробуйте это и посмотрите, есть ли у вас лучшие результаты.
Однако Хаффман только даст вам хорошие коэффициенты сжатия если вы часто встречающиеся символы. Вы случайно взглянули на гистограмму или распространение ваших пикселей на вашем изображении?
Если спред довольно большой, с очень небольшим количеством записей в ящике, то Хаффман не даст вам экономии при сжатии. В результате он может дать вам размер. Имейте в виду, что в стандарте сжатия TIFF
используется только Хаффман как часть алгоритма. Существует также предварительная обработка и последующая обработка, чтобы дополнительно уменьшить размер.
В качестве еще одного примера предположим, что у меня было изображение, состоящее из [0, 1, 2, ... 255; 0, 1, 2, ..., 255; 0, 1, 2, ..., 255];
У меня есть 3 строки [0,255]
, но на самом деле это может быть любое количество строк. Это означает, что вероятность столкновения каждого символа равновероятна, или 1/255
, что означает, что для каждого символа нам понадобится 8 бит на символ ... который по существу является необработанным значением пикселя!
Ключ от Хаффмана состоит в том, что группа бит объединяет один символ. Часто встречающимся символам присваивается меньшая последовательность бит. Поскольку этот конкретный образ, о котором я говорил, имеет интенсивности, которые равновероятны, тогда вы генерируете только один символ на интенсивность, а не на группу. При этом вы не только передадите словарь, но и будете посылать по одному символу за раз, и это не лучше, чем отправка исходного потока байтов.
Если вы хотите, чтобы ваше изображение было сжато необработанным Хаффманом, распределение пикселей должно быть искажено. Например, если большая часть интенсивности вашего изображения темная или яркая. Если ваше изображение имеет хороший контраст или если разброс интенсивностей пикселей плоский по всему изображению, то Хаффман не даст вам экономии при сжатии.
Wow ... Почти 3 года LOL. Спасибо за согласие. – rayryeng