1.軟體版本
matlab2013b
2.系統概述
方塊編碼也叫方塊截斷編碼(block truncation coding,簡稱BTC)是靜态圖像編碼中的一種, 其原理是把一幅圖像分為大小為N×N的子像塊(簡稱子塊),由于小塊内各相鄰像素間具有亮度互相近似的相關性,于是隻選用兩個适當的亮度來近似代表小塊内各像素原來的亮度,然後指明子塊内的各像素分别屬于哪個亮度。
靜态圖像編碼是研究怎樣利用圖像固有的統計特性(信源特性),以及視覺的生理學、心理學特性(信宿特性),或者記錄裝置(如普通照相底片)和顯示裝置(如電視、監示器)等的特性,經過壓縮編碼從原始圖像資訊中提取出有效資訊,盡量去掉那些無用的備援資訊,以便高效率地進行圖像的數字傳輸或數字存儲;而在複原時仍能獲得與原始圖像相差不多的複原圖像,即保持圖像資訊中的有效資訊。
3.部分源碼
function code(tp,I)
fd=fopen('btc.bin','w+');
[m,n]=size(I);
fwrite(fd,m,'long');fwrite(fd,n,'long');
I=double(I);
A=zeros(tp);B=zeros(tp);c(1)=0;
for i=1:tp:m
for j=1:tp:n
A=I(i:i+tp-1,j:j+tp-1);
sum_col_A=sum(A,1); %子塊按列求和
sum_A=sum(sum_col_A,2); %子塊矩陣的和
mean_A=mean2(A); %子塊的均值
for L=1:tp
for k=1:tp
if A(L,k)>=mean_A
B(L,k)=1;
else
B(L,k)=0;
end
end
end
nozeronum=nnz(B); %映像矩陣中非0元素的個數
AmulB=times(A,B);
sum_AmulB=sum(sum(AmulB(:,:),1),2);
if nozeronum==0
c(1)=0;
c(2)=0;
else
c(1)=round(sum_AmulB/nozeronum); %子塊矩陣中的重建電平
if nozeronum==tp*tp
c(2)=c(1);
else
c(2)=round((sum_A-sum_AmulB)/(tp*tp-nozeronum));
end
end
fwrite(fd,B,'ubit1');
fwrite(fd,c,'ubit8');
end
end
fclose(fd);
fd=fopen('btc.bin','r');
m=fread(fd,1,'long');n=fread(fd,1,'long');
A=zeros(m,n);
for i=1:tp:m
for j=1:tp:n
B=fread(fd,[tp,tp],'ubit1');
c(1)=fread(fd,1,'ubit8');
c(2)=fread(fd,1,'ubit8');
for k=1:tp
for L=1:tp
if B(k,L)==0
A(i+(k-1),j+(L-1))=c(2);
else
A(i+(k-1),j+(L-1))=c(1);
end
end
end
end
end
A=uint8(A);
imshow(A);title('用方塊編碼後圖象')
imwrite(A,'lenabianma.bmp');
fclose(fd);
4.仿真結果
2*2
4*4