2014-09-22 2 views
3

Я пытаюсь сжать изображение в градациях серого с использованием кодирования Хаффмана в MATLAB и пробовал следующий код.Сжатие изображений в оттенках серого с использованием кодирования Хаффмана в MATLAB

Я использовал изображение в оттенках серого размером 512х512 в формате tif. Моя проблема заключается в том, что размер сжатого изображения (длина сжатого кодового слова) становится больше, чем размер несжатого изображения. Степень сжатия становится меньше 1.

clc; 
clear all; 
A1 = imread('fig1.tif'); 
[M N]=size(A1); 
A = A1(:); 
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 

[dict,avglen]=huffmandict(count,p) % build the Huffman dictionary 
comp= huffmanenco(A,dict);   %encode your original image with the dictionary you just built 
compression_ratio= (512*512*8)/length(comp) %computing the compression ratio 

%% DECODING 
Im = huffmandeco(comp,dict); % Decode the code 
I11=uint8(Im); 

decomp=reshape(I11,M,N); 
imshow(decomp); 

ответ

2

В вашем коде небольшая ошибка. Я предполагаю, что вы хотите рассчитать вероятность столкновения каждого пикселя, который является нормированной гистограммой. Вы не правильно его вычисляете. В частности:

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 бит на символ ... который по существу является необработанным значением пикселя!

Ключ от Хаффмана состоит в том, что группа бит объединяет один символ. Часто встречающимся символам присваивается меньшая последовательность бит. Поскольку этот конкретный образ, о котором я говорил, имеет интенсивности, которые равновероятны, тогда вы генерируете только один символ на интенсивность, а не на группу. При этом вы не только передадите словарь, но и будете посылать по одному символу за раз, и это не лучше, чем отправка исходного потока байтов.

Если вы хотите, чтобы ваше изображение было сжато необработанным Хаффманом, распределение пикселей должно быть искажено. Например, если большая часть интенсивности вашего изображения темная или яркая. Если ваше изображение имеет хороший контраст или если разброс интенсивностей пикселей плоский по всему изображению, то Хаффман не даст вам экономии при сжатии.

+0

Wow ... Почти 3 года LOL. Спасибо за согласие. – rayryeng

Смежные вопросы