霍夫曼編碼的matlab實現(只有編碼)

2021-10-07 04:23:30 字數 4213 閱讀 7911

~~第一次原創部落格,記錄一下課程實驗,這次實驗主要是實現利用霍夫曼編碼方法對影象進行編碼,利用matlab實現。在網上搜尋了一下,高閱讀量的幾個matlab都是通過陣列實現,很是方便,但是理解起來比較困難,我便從霍夫曼編碼樹出發,從概率分布生成霍夫曼編碼樹,然後再得到編碼。直接上**。

function code_table=

huffman_my(l

,imhist_p)%%

l 是灰度級,一般為256,imhist_p 為灰度概率分布

%%進行霍夫曼編碼

tic%

% 生成結點,存放到leaf_str 的結構體陣列中

for i =1:

l tmp_str=

struct

('name'

,i,'prob'

,imhist_p

(i),

'parent',[

],'lchild',[

],'rchild',[

],'code',[

]);leaf_str

(i)=tmp_str;

end%

% 生成霍夫曼編碼樹

while

length

(leaf_str)

>1[

~,index]

=sort

([leaf_str.prob]);

leaf_str=

leaf_str

(index)

; tmp_str.prob=

leaf_str(1

).prob+

leaf_str(2

).prob;

tmp_str.name=0;

tmp_str.lchild=

leaf_str(1

);tmp_str.rchild=

leaf_str(2

);tmp_str.parent=

;leaf_str(1

).parent=tmp_str;

leaf_str(2

).parent=tmp_str;

leaf_str

(end+1)

=tmp_str;

leaf_str(1

:2)=

;end

%% 廣度優先搜尋進行編碼,構建編碼表

bfs=leaf_str;

code_table=

cell(l

,1);

% code_talbe=

strings

(256,1

)while

~isempty

(bfs

) tmp_str=

bfs(1)

;if~isempty

(tmp_str.lchild)

tmp_str.lchild.code=

[tmp_str.code,1]

;% tmp_str.lchild.code=

[tmp_str.code,

'1']

;bfs

(end+1)

=tmp_str.lchild;

endif

~isempty

(tmp_str.rchild)

tmp_str.rchild.code=

[tmp_str.code,0]

;% tmp_str.rchild.code=

[tmp_str.code,

'0']

;bfs

(end+1)

=tmp_str.rchild;

endif tmp_str.name~=0

code_table

=tmp_str.code;

endbfs(1

)=;end

tocend

從訓練集獲取影象獲取總的灰度級概率分布,然後對測試集中資料進行編碼。

function main

clear

clc%

% 匯入資料,統計灰度級的概率分布

train_file_path = '.\train\';

train_img_path_list =

dir(

strcat

(train_file_path,

'*.bmp'))

;img_num =

length

(train_img_path_list);l

=256

;counts_total=

zeros(l

,1);

if img_num >

0for k =

1:img_num

image_name=

train_img_path_list

(k).name;

image =

imread

(strcat

(train_file_path,image_name));

image=

rgb2gray

(image)

;[counts_one,~]

=imhist

(image)

; counts_total=counts_total+counts_one;

endend%

% 概率分布

imhist_p=counts_total/

sum(counts_total);%

% 進行霍夫曼編碼

code_table=

huffman_my(l

,imhist_p);%

% 對測試影象進行編碼

test_file_path = '.\test\';

test_img_path_list =

dir(

strcat

(test_file_path,

'*.bmp'))

;img_num =

length

(test_img_path_list)

;if img_num >

0for j =

1:img_num

image_name=

test_img_path_list

(j).name;

image =

imread

(strcat

(test_file_path,image_name));

image=

rgb2gray

(image)

; name_former=

split

(image_name,

'.')

; bin_file_name=

cell2mat

(strcat

(name_former(1

),'.txt'))

;[h,w]

=size

(image)

; write_file=

fopen([

'.\result\',bin_file_name],'w')

; code_len=0;

for i =1:h

for j =1:w

fprintf

(write_file,

dec2bin

(cell2mat

(code_table

(image

(i,j)+1

))))

; code_len=code_len+

length

(cell2mat

(code_table

(image

(i,j)+1

)));

endend

compressing_rate=code_len/

(h*w*8)

;disp([

'the compression rate of '

,bin_file_name,

' is '

,num2str

(compressing_rate)])

fclose

(write_file)

; end

endend

目前只實現的以01字元流寫入文字,等有時間更新一下以01二進位製流寫入檔案。

霍夫曼編碼演算法與實現

一 實驗原理 1.huffman編碼演算法 1 將檔案以ascii字元流的形式讀入,統計每個符號的發生頻率 2 將所有檔案中出現過的字元按照頻率從小到大的順序排列 3 每一次選出最小的兩個值,作為二叉樹的兩個葉子節點,將和作為它們的根節點,這兩個葉子節點不再參與比較,新的根節點參與比較 4 重複3,...

霍夫曼編碼的改進

首先說一說經典霍夫曼編碼。把符號按照出現概率排序,合併概率最小的兩項,為新的節點。然後重複排序 合併的步驟,直到只剩下乙個節點。最後,從根節點開始,向葉節點進行編碼。改進後的霍夫曼編碼,不再是二進位制的。它可以是多進製,例如26進製。操作方法 把符號按出現概率排序,合併概率最小的26項,為新的節點。...

基於實現霍夫曼編碼的無失真壓縮 C 實現

1 把任務十中的文字字元轉為國標碼,計算共需要多少位元。2 用你所學的方法 霍夫曼編碼 遊長編碼或算數編碼 壓縮這些字元,得到的壓縮碼流共計多少位元。說明資料的冗餘度在 3 手動編碼也可以。最好程式設計實現壓縮。1 漢字機內碼 區位碼 國標碼簡介 漢字的機內碼是漢字在計算機漢字系統內部的表示方法,是...