網(wǎng)站平臺(tái)延展性網(wǎng)站優(yōu)化與seo
一、圖片壓縮算法
有損算法:
JPEG,我們最為常用的算法。他是通過離散余弦變換,對(duì)圖片質(zhì)量盡量小的時(shí)候進(jìn)行有損壓縮,該算法對(duì)高中波特率下效果很好,但是對(duì)低波特率下,就會(huì)出現(xiàn)方格之類的,比如100多MB的MPEG電影,會(huì)發(fā)現(xiàn)稍微一暗就很多格子。為了解決這個(gè)問題,提出了JPEG2000標(biāo)準(zhǔn)。
JPEG2000使用了小波變換算法,自稱壓縮率比JPEG高30%,同時(shí)對(duì)局部支持不壓縮。同時(shí)支持先輪廓、模糊逐步清晰的編碼(PNG,GIF和JPEG均支持interlace編碼),但是目前推廣比較差,還沒看到支持的瀏覽器。該算法壓縮速度比較慢也是限制其發(fā)展的原因。
混合:
Webp,google在推的一種壓縮算法,初衷是用于視頻壓縮。算法原理是預(yù)測編碼,只有在發(fā)生變化(轉(zhuǎn)折)時(shí)插入新的數(shù)據(jù)。同時(shí)支持有損和無損壓縮。壓縮率號(hào)稱比JPEG高40%但是計(jì)算開銷也達(dá)到8倍。
TIFF,標(biāo)記型,支持多個(gè)圖層,每個(gè)圖層可以是JPEG有損的也可以是PNG等無損的。
無損壓縮:
僅僅是對(duì)數(shù)據(jù)進(jìn)行重復(fù)數(shù)據(jù)的短碼方式的壓縮。PNG和GIF本質(zhì)沒啥區(qū)別,GIF早期本分算法被專利了,所以發(fā)展了PNG,但是PNG支持更多的顏色,如果是PNG8基本跟GIF一樣了。透明度的支持,PNG8和GIF只支持布爾透明度,PNG16,32支持8位也就是256級(jí)的透明程度。理論上PNG24不支持透明,但是目前還是發(fā)現(xiàn)有些庫支持部分不支持。PNG24,24位色彩,也成為真色彩,相當(dāng)1600W顏色,已經(jīng)是人眼能分辨的最高級(jí)了。
不壓縮:
矢量圖,縮放或者放大都不會(huì)影響其平滑度,不是所有的字體都是TrueType之類的矢量圖的。
BMP,bitmap,每個(gè)像素8bit,從下往上掃描。
二、數(shù)字圖像處理
詳細(xì)信息請(qǐng)看我的資源
三、圖像壓縮原理
1 圖像可壓縮的原因
一張?jiān)紙D像(1920x1080),如果每個(gè)像素32bit表示(RGBA),那么,圖像需要的內(nèi)存大小
1920x1080x4 = 8294400 Byte,大約8M。這我們是萬萬不能接受的。如果這樣,1G硬盤才存100多張圖片,傷不起啊!視頻也一樣,如果視頻是1920x1080,30fps, 1小時(shí)。那不壓縮大概需要的內(nèi)存:
8Mx30x60*60 = 864000M,都800多G了!瘋了吧!
所以說,我們需要圖像壓縮。
常見圖像、視頻、音頻數(shù)據(jù)中存在的冗余類型如下:
1.1 空間冗余
一幅圖像表面上各采樣點(diǎn)的顏色之間往往存在著空間連貫性,比如下圖,兩只老鼠的顏色,背后的墻,灰色的地板,顏色都一樣。這些顏色相同的塊就可以壓縮。
比如說,第一行像素基本都一樣,假設(shè)亮度值Y是這么存的
[105 105 105…….105],如果共100個(gè)像素,那需要1Byte*100。
最簡單的壓縮:[105, 100],表示接下來100個(gè)像素的亮度都是105,那么只要2個(gè)字節(jié),就能表示整行數(shù)據(jù)了!豈不是壓縮了!
1.2 時(shí)間冗余
這種冗余主要針對(duì)視頻。
運(yùn)動(dòng)圖像(視頻)一般為位于一時(shí)間軸區(qū)間的一組連續(xù)畫面,其中的相鄰幀往往包含相同的背景和移動(dòng)物體,只不過移動(dòng)物體所在的空間位置略有不同,所以后一幀的數(shù)據(jù)與前一幀的數(shù)據(jù)有許多共同的地方,這種共同性是由于相鄰幀記錄了相鄰時(shí)刻的同一場景畫面,所以稱為時(shí)間冗余。
1.3 視覺冗余
人類的視覺系統(tǒng)由于受生理特性的限制,對(duì)于圖像場的注意是非均勻的,人對(duì)細(xì)微的顏色差異感覺不明顯。
例如,人類視覺的一般分辨能力為26灰度等級(jí),而一般的圖像的量化采用的是28灰度等級(jí),即存在視覺冗余。
人類的視覺覺對(duì)某些信號(hào)反映不太敏感,使得壓縮后再還原有允許范圍的變化,人也感覺不出來。
2 圖像壓縮編碼舉例
2.1 行程編碼(RLE)
這是最好理解的一種編碼了。
現(xiàn)實(shí)中有許多這樣的圖像,在一幅圖像中具有許多顏色相同的圖塊。在這些圖塊中,許多行上都具有相同的顏色,或者在一行上有許多連續(xù)的像素都具有相同的顏色值。在這種情況下就不需要存儲(chǔ)每一個(gè)像素的顏色值,而僅僅存儲(chǔ)一個(gè)像素的顏色值,以及具有相同顏色的像素?cái)?shù)目就可以,或者存儲(chǔ)像素的顏色值,以及具有相同顏色值的行數(shù)。
這種壓縮編碼稱為行程編碼(run length encoding,RLE),具有相同顏色并且是連續(xù)的像素?cái)?shù)目稱為行程長度。
例如,字符串AAABCDDDDDDDDBBBBB
利用RLE原理可以壓縮為3ABC8D5B
RLE編碼簡單直觀,編碼/解碼速度快,
因此許多圖形和視頻文件,如.BMP .TIFF及AVI等格式文件的壓縮均采用此方法.
由于一幅圖像中有許多顏色相同的圖塊,用一整數(shù)對(duì)存儲(chǔ)一個(gè)像素的顏色值及相同顏色像素的數(shù)目(長度)。例如:
(G ,L)//G為顏色值,L為長度值
編碼時(shí)采用從左到右,從上到下的排列,每當(dāng)遇到一串相同數(shù)據(jù)時(shí)就用該數(shù)據(jù)及重復(fù)次數(shù)代替原來的數(shù)據(jù)串。
舉例,如下的18*7的像素(假設(shè)只有灰度值,1字節(jié))
000000003333333333
222222222226666666
111111111111111111
111111555555555555
888888888888888888
555555555555553333
222222222222222222
僅僅需要11對(duì)數(shù)據(jù)表示。
(0,8) (3,10) (2,11) (6,7)
(1,18) (1,6) (5,12) (8,18)
(5,14) (3,4) (2,18)
2.2 哈夫曼編碼(Huffman)
由于圖像中表示顏色的數(shù)據(jù)出現(xiàn)的概率不同,對(duì)于出現(xiàn)頻率高的賦(編)予較短字長的碼,對(duì)出現(xiàn)頻率小的編于較長字長的碼,從而減少總的代碼量,但不減少總的信息量。
- 計(jì)算字符串中每個(gè)字符的頻率:
- 按照字符出現(xiàn)的頻率進(jìn)行排序,組成一個(gè)隊(duì)列 Q ,出現(xiàn)頻率最低的在前面,出現(xiàn)頻率高的在后面。
- 把這些字符作為葉子節(jié)點(diǎn)開始構(gòu)建一顆哈夫曼樹,哈夫曼樹又稱為最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹。
- 對(duì)字符進(jìn)行編碼:
因此各個(gè)字母的編碼分別為:
A | B | C | D |
---|---|---|---|
11 | 100 | 0 | 101 |
在沒有經(jīng)過哈夫曼編碼之前,字符串“BCAADDDCCACACAC”的二進(jìn)制為:
10000100100001101000001010000010100010001000100010001000100001101000011010000010100001101000001010000110100000101000011
也就是占了 120 比特;
編碼之后為:
1000111110110110100110110110
占了 28 比特。
2.3 DCT編碼
2.3.1 基本概念
離散余弦變換(Discrete Cosine Transform, DCT)
離散余弦變換與離散傅里葉變換密切相關(guān)。它是可分離的線性變換;也就是說,該二維變換等效于先沿一個(gè)維度執(zhí)行一維 DCT,然后在另一維度中執(zhí)行一維 DCT。
離散余弦變換(DCT)的基函數(shù)
離散余弦變換(DCT)中的基函數(shù)是用于表示圖像或信號(hào)的正交函數(shù)集。每個(gè)基函數(shù)代表一個(gè)特定頻率模式,這些模式可以用來重建原始信號(hào)。在二維DCT中,基函數(shù)是兩個(gè)一維DCT基函數(shù)的乘積,分別對(duì)應(yīng)于行和列方向。
在應(yīng)用到圖像壓縮(如JPEG格式)時(shí),低頻基函數(shù)通常攜帶了圖像的主要信息,而高頻基函數(shù)則負(fù)責(zé)捕捉圖像中的細(xì)小變化。由于人類視覺系統(tǒng)對(duì)高頻細(xì)節(jié)不那么敏感,所以在編碼過程中高頻成分常常被量化為更低精度,從而實(shí)現(xiàn)數(shù)據(jù)壓縮。
2.3.2 變換壓縮原理框圖
G : 輸入源圖像
G’ :解碼后的圖像
U: 二維正交變換
U’ : 二維正交逆變換
function [I2,mask] = reconstructImage(I,n)
% Reconstruct the image from n of the DCT coefficients in each 8-by-8
% block. Select the n coefficients with the largest variance across the
% image. Second output argument is the 8-by-8 DCT coefficient mask.
% Compute 8-by-8 block DCTs.
f = @(block) dct2(block.data);
A = blockproc(I,[8 8],f);
% Compute DCT coefficient variances and decide
% which to keep.
B = im2col(A,[8 8],'distinct')';
vars = var(B);
[~,idx] = sort(vars,'descend');
keep = idx(1:n);
% Zero out the DCT coefficients we are not keeping.
B2 = zeros(size(B));
B2(:,keep) = B(:,keep);
% Reconstruct image using 8-by-8 block inverse
% DCTs.
C = col2im(B2',[8 8],size(I),'distinct');
finv = @(block) idct2(block.data);
I2 = blockproc(C,[8 8],finv);
mask = false(8,8);
mask(keep) = true;
end