~~第一次原創部落格,記錄一下課程實驗,這次實驗主要是實現利用霍夫曼編碼方法對影象進行編碼,利用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 漢字機內碼 區位碼 國標碼簡介 漢字的機內碼是漢字在計算機漢字系統內部的表示方法,是...