В вашем коде есть небольшая ошибка. Я предполагаю, что вы хотите рассчитать вероятность встречи с каждым пикселем, которая является нормализованной гистограммой. Вы не рассчитываете это правильно. Конкретно:
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 = 0:255;
p = imhist(A1) / numel(A1);
Это позволит правильно рассчитать распределение вероятностей для вашего изображения. Помните, когда вы выполняете кодирование Хаффмана, вам необходимо указать вероятность обнаружения пикселя. Предполагая, что каждый пиксель может быть выбран с одинаковой вероятностью, это фиксируется путем вычисления гистограммы изображения с последующей нормализацией на общее количество пикселей в вашем изображении. Попробуйте это и посмотрите, добьетесь ли вы лучших результатов.
Однако Хаффман даст вам хорошие коэффициенты сжатия, если у вас есть часто встречающиеся символы. Вы случайно не смотрели на гистограмму или разброс пикселей на вашем изображении?
Если разброс довольно большой, с очень небольшим количеством записей на ячейку, то Хаффман не даст вам никакой экономии на сжатии. Фактически, в результате вы можете получить больший размер. Имейте в виду, что стандарт сжатия TIFF
использует Хаффмана только как часть алгоритма. Также выполняется некоторая предварительная и постобработка для дальнейшего уменьшения размера.
В качестве другого примера предположим, что у меня есть изображение, состоящее из [0, 1, 2, ... 255; 0, 1, 2, ..., 255; 0, 1, 2, ..., 255];
, у меня есть 3 строки по [0,255]
, но на самом деле это может быть любое количество строк. Это означает, что вероятность встретить каждый символ равновероятна, или 1/255
, что означает, что для каждого символа нам потребуется 8 бит на символ ... что, по сути, является необработанным значением пикселя в любом случае!
Ключ Хаффмана состоит в том, что группа битов вместе генерирует один символ. Часто встречающимся символам назначается меньшая последовательность битов. Поскольку это конкретное изображение, о котором я говорил, имеет равновероятную интенсивность, тогда вы будете генерировать только один символ для каждой интенсивности, а не группу. При этом вы не только будете передавать словарь, но и будете отправлять по одному символу за раз, и это не лучше, чем отправка необработанного потока байтов.
Если вы хотите, чтобы ваше изображение было сжато необработанным методом Хаффмана, распределение пикселей должно быть искажено. Например, если большая часть яркости на вашем изображении темная или светлая. Если ваше изображение имеет хороший контраст или если интенсивность пикселей равномерна по всему изображению, то Хаффман не даст вам никакой экономии на сжатии.
person
rayryeng
schedule
22.09.2014