資源簡介
對于顏色不太豐富的彩色圖像來說,用 24 位存儲真彩色存在一定的浪費。如果 24 位彩色轉(zhuǎn)成 256 色圖像,則可以將數(shù)據(jù)壓縮到原來的 1/3。但是,壓縮的過程中可能存在失真。因此,保持顏色最小失真的情況下,選擇保留主要顏色,去除非主要的顏色是壓縮算法的重
點。-
代碼片段和文件信息
function?[IImap]=Truergbto256(Filen)
%%?-----------------------------------------------
%??EXPLAIN:?24位RGB真彩色圖像轉(zhuǎn)256色圖像程序
%??
%??INPUT:?File:圖像文件名
%?????????n:數(shù)據(jù)預(yù)處理時的參數(shù),即舍棄原數(shù)據(jù)低位的位數(shù)
%????????
%??OUTPUT:?II:?轉(zhuǎn)換后的圖像數(shù)據(jù),
%??????????map:256色圖像的調(diào)色板
%??????????并轉(zhuǎn)換后得到的256色圖像寫入文件
%
%??AUTHOR:Yang?Hao
%??DATE:?2019/5/8
%%?-----------------------------------------------
%tic??%計時
img=imread(File);
[MNdim]=size(img);
if?dim~=3?||?~isa(img‘uint8‘)?%?輸入文件不是24位真彩色圖像則報錯并結(jié)束程序?
????error(‘Error!!!?Please?enter?the?correct?24-bit?true?color?image‘);
end
Iold=img;%保存原數(shù)據(jù),方便后續(xù)計算
%%?數(shù)據(jù)預(yù)處理
img=floor(double(img)/2^n);%舍棄低位n位數(shù)據(jù)
%?分別讀取R、G、B值
R=img(::1);
G=img(::2);
B=img(::3);
%?將R、G、B整合為一個唯一整數(shù)數(shù)組,一個整數(shù)唯一代表了一種顏色
color=(double(R)*10^4+double(G)*10^2+double(B));
sta?=?tabulate(color(:))‘;%統(tǒng)計各個整數(shù)符號的概率
sta(:find(sta(2:)==0))=[];%刪除概率為0的列
symb?=?sta(1:);%?所有出現(xiàn)整數(shù)符號數(shù)組,
freq?=?sta(3:);%?所有出現(xiàn)整數(shù)符號的概率數(shù)組,
%%?調(diào)色板創(chuàng)建
[~sortindex]?=?sort(freq‘descend‘);%概率數(shù)組有高到底排序
symb?=?symb(sortindex)‘;?%按概率排序的符號
if?length(symb)>256?%?若原圖像顏色小于256種,則全部顏色作為調(diào)色板顏色,否則取概率前256種顏色
????symb?=?symb(1:256);
end
%?恢復(fù)整數(shù)代表的唯一顏色,三個分量分別存儲為r、g、b
r=floor(symb/10000);
g=floor(mod(symb10000)/100);
b=floor(mod(symb100
評論
共有 條評論