日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实验5_JPEG解码

發布時間:2024/4/30 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验5_JPEG解码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗5_JPEG

  • 一、JPEG是什么?
    • 1、JPEG簡介
    • 2、JPEG優缺點
    • 3、JPEG4種運行模式
  • 二、JPEG編碼
    • 1、Level offset(零偏置)
    • 2、8×8DCT
    • 3、量化
    • 4、DCT直流值和AC交流系數的編碼
    • 5、熵編碼
  • 三、JPEG文件格式分析
    • 1、JPEG格式說明
    • 2、JPEG主要數據段說明
      • 1)SOI ->Start of Image
      • 2)APP0 ->Application 0(保留標記)
      • 3)APPx -> APPn->Application,x=1~15(可任選)
      • 4)DQT ->Define Quantization Table,定義量化表
      • 5)SOF0 ->Start of Frame
      • 6)DHT ->Difine Huffman Table
      • 7)DRI ->Define Restart Interval
      • 8)SOS ->Start of Scan
      • 9)EOI ->End of Image
  • 四、實驗解碼代碼分析
    • 1、jedc_private結構體
    • 2、compontent結構體
    • 3、build_huffman_table函數
    • 4、build_quantization_table函數
    • 5、生成YUV圖像
    • 6、輸出量化矩陣
    • 7、輸出Huffman碼表
    • 8、結果分析
      • 1)生成文件
      • 2)YUV圖像
      • 3)量化表
      • 4)huffman表
  • 鳴謝

一、JPEG是什么?

1、JPEG簡介

JPEG( Joint Photographic Experts Group)即聯合圖像專家組,是用于連續色調靜態圖像壓縮的一種標準,文件后綴名為.jpg或.jpeg,是最常用的圖像文件格式。其主要是采用預測編碼(DPCM)、離散余弦變換(DCT)以及熵編碼的聯合編碼方式,以去除冗余的圖像和彩色數據,屬于有損壓縮格式,它能夠將圖像壓縮在很小的儲存空間,一定程度上會造成圖像數據的損傷。尤其是使用過高的壓縮比例,將使最終解壓縮后恢復的圖像質量降低,如果追求高品質圖像,則不宜采用過高的壓縮比例。
然而,JPEG壓縮技術十分先進,它可以用有損壓縮方式去除冗余的圖像數據,換句話說,就是可以用較少的磁盤空間得到較好的圖像品質。而且JPEG是一種很靈活的格式,具有調節圖像質量的功能,它允許用不同的壓縮比例對文件進行壓縮,支持多種壓縮級別,壓縮比率通常在10;1到40;1,壓縮比越大,圖像品質就越低;相反地,壓縮比越小,圖像品質就越高。同一幅圖像,用JPEG格式存儲的文件是其他類型文件的1/10~1/20,通常只有幾十KB,質量損失較小,基本無法看出。JPEG格式壓縮的主要是高頻信息,對色彩的信息保留較好,適合應用于互聯網;它可減少圖像的傳輸時間,支持24位真彩色;也普遍應用于需要連續色調的圖像中。
JPEG格式可分為標準JPEG、漸進式JPEG及JPEG2000三種格式。

  • 標準JPEG格式;此類型在網頁下載時只能由上而下依序顯示圖像,直到圖像資料全部下載完畢,才能看到圖像全貌。
  • 漸進式JPEG;此類型在網頁下載時,先呈現出圖像的粗略外觀后,再慢慢地呈現出完整的內容,而且存成漸進式JPG格式的文檔比存成標準JPG格式的文檔要來得小,所以如果要在網頁上使用圖像,可以多用這種格式。
  • JPEG2000;它是新一代的影像壓縮法,壓縮品質更高,并可改善在無線傳輸時,常因信號不穩造成馬賽克現象及位置錯亂的情況,改善傳輸的品質。
  • 2、JPEG優缺點

    優點:
    1)它支持極高的壓縮率,因此JPEG圖像的下載速度大大加快。
    2)它能夠輕松地處理16.8M顏色,可以很好地再現全彩色的圖像。
    3)在對圖像的壓縮處理過程中,該圖像格式可以允許自由地在最小文件尺寸(最低圖像質量)和最大文件尺寸(最高圖像質量)之間選擇。
    4)該格式的文件尺寸相對較小,下載速度快,有利于在帶寬并不“富?!钡那闆r下傳輸。
    缺點:
    1)并非所有的瀏覽器都支持將各種JPEG圖像插入網頁。
    2)壓縮時,可能使圖像的質量受到損失,因此不適宜用該格式來顯示高清晰度的圖像。

    3、JPEG4種運行模式

    在JPEG算法中,共包含4種運行模式,其中一種是基于DPCM的無損壓縮算法,另外3種是基于DCT的有損壓縮算法。其要點如下:
    1)無損壓縮編碼模式。采用預測法和哈夫曼編碼(或算術編碼)以保證重建圖像與原圖像完全相同(設均方誤差為零),可見無失真。
    2)基于DCT的順序編碼模式。根據DCT變換原理,按從上到下、從左到右的順序對圖像數據進行壓縮編碼。當信息傳送到接收端時,首先按照上述規律進行解碼,從而還原圖像。在此過程中存在信息丟失,因此這是一種有損圖像壓縮編碼。
    3)基于DCT的累進編碼模式。它也是以DCT變換為基礎的,但是其掃描過程不同。它通過多次掃描的方法來對一幅圖像進行數據壓縮。其描述過程采取由粗到細逐步累加的方式進行。圖像還原時,在屏幕上首先看到的是圖像的大致情況,而后逐步地細化,直到全部還原出來為止。
    4)基于DCT的分層編碼模式。這種模式是以圖像分辨率為基準進行圖像編碼的。它首先是從低分辨率開始,逐步提高分辨率,直至與原圖像的分辨率相同為止。圖像重建時也是如此??梢娖湫Чc基于DCT累進編碼模式相似,但其處理起來更復雜,所獲得的壓縮比也更高一些。

    二、JPEG編碼

    基本(baseline) JPEG編碼器如下圖:

    下面按步驟簡單的介紹一下各部分:

    1、Level offset(零偏置)

    對于灰度級是2n的像素,通過減去2n-1,將無符號的整數值變成有符號數
    ? 對于n=8,即將0-255的值域,通過減去128,轉換為值域在-128-127之間的值
    ?目的:使像素的絕對值出現3位10進制的概率大大減少

    2、8×8DCT

    對每個單獨的彩色圖像分量,把整個分量圖像分成8×8的圖像塊,如圖所示,并作為兩維離散余弦變換DCT的輸入

    DCT變換使用下式計算

    逆變換使用下式計算

    其中

    3、量化

    為了達到壓縮的目的,DCT系數需作量化,量化表針對的設計。例如,利用人眼的視覺特性,對在圖象中占有較大能量的低頻成分,賦予較小的量化間隔和較少的比特表示,以獲得較高的壓縮比。

    JPEG的量化采用線性均勻量化器,量化公式為:

    Cq(u,v)=Integer(Round(C(u,c)/Q(u,v))

    其中Q(u,v)是量化器步長,它是量化表的元素,量化元素隨DCT系數的不同和彩色分量的不同有不同的值。量化表的大小也為8X8,和64個變換系數一一對應。在JPEG算法中,對于8X8的亮度信息和色度信息,分別給出了缺省的量化表。這個量化表在實驗的基礎上,結合人眼的視覺特性而獲得的

    4、DCT直流值和AC交流系數的編碼

    DC系數差分編碼與AC系數游程編碼,64個變換系數中,DC系數是處于左上角的,它實際上等于64個圖像采樣值的平均值。相鄰的8×8子塊之間的DC系數有較強的相關性。JPEG對于量化后的DC系數采用差分編碼,二相鄰塊的DC系數的差值為DCi-(DCi-1)。其余63個AC系數量化后通常出現較多零值,JPEG算法采用游程編碼,并建議在8×8矩陣中按照“Z”形的次序進行,可增加零的連續次數。

    系數編碼后都采用統一的格式表示,包含二個符號的內容:第一符號占一個字節,對于DC系數而言,它的高4位總為零;對于AC系數而言,它表示到下一個非零系數前,所包含的連續為零的系數個數。第一字節的低4位表示DC差值的幅值編碼所需的比特數,或表示AC系數中下一個非零幅值編碼所需的比特數。第二個符號字節表示DC差值的幅值,或下一個非零AC系數的幅值。

    還需要指出,由于第一字節中只有4位表示游程長度,量大值為15。當游程長度大于15時,可以插入一個至多個(10)字節,直至剩下的零AC系數個數小于15為止。因此,63個AC系數表示為由二個符號對組成的序列,其中也可能插入10個字節,快結束字節以全零表示。

    l DC值:量化后,坐標u=v=0時的取值。它是整個塊能量的主要部分,它有兩個特點:

    – 該值比較大

    – 相鄰的兩個圖像塊之間的DC值變化不大

    l 對于量化后的AC系數,它是一個稀疏矩陣:矩陣中許多位置上的值為零。

    – 采用RLE編碼

    – 用EOB(特殊的碼字表示塊的結束

    l 例如下面的量化后的亮度快,按Z字形排列:

    下標:0 1 2 3 4 5 6 7 8 9—30 31 32—63

    系數:12 5 -2 0 2 0 0 0 1 0 -1 0

    5、熵編碼

    對于上面給出的碼序列,再進行統計特性的熵編碼。這僅對于序列中每個符號對中的第一個字節進行,第二個幅值字節不作編碼,仍然直接傳送。

    JPEG建議使用二種熵編碼方法:哈夫曼編碼和自適應二進制算術編碼。對于哈夫曼編碼,JPEG提供了針對DC系數、AC系數使用的哈夫曼表(包括對于圖像的亮度值與色度值二種情況),在編碼和解碼時使用。JPEG解碼器能夠同時存儲最多4套不同的熵編碼表。

    三、JPEG文件格式分析

    1、JPEG格式說明

    JPEG文件可以看作由多條數據段拼接成的文件,每條數據段包括兩個部分:標記碼和數據流。

    標記碼:由兩個字節構成,其前一個字節為0xFF(通常只有一個0xFF,可以多個連續的0xFF),后一個字節則根據不同意義有不同數值。
    數據流:記錄了關于JPEG文件的相應信息(有些數據段無數據流)。

    常用的數據段有SOI、APPx、DQT、SOF0、DHT、DRI、SOS、EOI等(SOI等只是數據段名,例如SOI是標記碼為0xFFD8的數據段名,DHT是標記碼為0xFFC4的數據段名)。

    2、JPEG主要數據段說明

    1)SOI ->Start of Image

    含義:圖像開始
    標記碼:0xFFD8 占2字節
    數據流:無

    2)APP0 ->Application 0(保留標記)

    含義:應用程序保留標記0
    標記碼:0xFFE0——占2字節
    數據流:
    數據段長度——占2字節
    標識符——5字節(固定值0x4A46494600=“JFIF0”)
    版本號——2字節
    密度單位——1字節(0->無單位 1->點數/英寸 2->點數/厘米)
    X方向像素密度——2字節
    Y方向像素密度——2字節
    縮略圖水平像素數目——1字節
    縮略圖垂直像素數目——1字節
    縮略圖RGB位圖——長度為是3的倍數

    3)APPx -> APPn->Application,x=1~15(可任選)

    含義:應用程序保留標記x
    標記碼:0xFFE1~0xFFF——2字節(手機照片通常包含APP1,內容由地點,時間等)
    數據流:
    數據段長度——占2字節(不同數據段數據格式不同)

    4)DQT ->Define Quantization Table,定義量化表

    含義:定義量化表
    標記碼:0xFFDB——占2字節
    數據流:
    數據段長度——占2字節
    量化表長度——占2字節
    量化表ID——占1字節
    量化表內容——占64字節
    (量化表可以有多個,不超過4個)

    量化表1

    量化表2

    5)SOF0 ->Start of Frame

    含義:幀圖像起始
    標記碼:0xFFC0——占2字節
    數據流:
    數據段長度——占2字節
    精度——1字節
    圖像高度——2字節
    圖像寬度——2字節
    顏色分量數——1字節(1-灰度圖 3-YCrCb或YIQ 4-CMYK)
    顏色分量信息——9字節

    6)DHT ->Difine Huffman Table

    含義:定義哈夫曼表
    標記碼:0xFFC4——占2字節
    數據流:
    數據段長度——占2字節
    霍夫曼表長度——占2字節
    表ID和表類型——1字節
    不同位數的碼字數量——16字節
    編碼內容——占16個不同位數的碼字數量之和字節

    哈夫曼表1

    哈夫曼表2

    哈夫曼表3

    哈夫曼表4

    7)DRI ->Define Restart Interval

    含義:定義差分編碼累計復位的間隔
    標記碼:0xFFDD——占2字節
    數據流:
    數據段長度——占2字節(長度固定為4)
    MCU塊的單元中的重新開始間隔——占2字節

    8)SOS ->Start of Scan

    含義:定義差分編碼累計復位的間隔
    標記碼:0xFFDA——占2字節
    數據流:
    數據段長度——占2字節
    顏色分量數——1字節(1-灰度圖是 3-YCrCb或YIQ 4-CMYK)
    顏色分量ID——1字節
    直流/交流系數表號——1字節
    壓縮圖像數據——3字節(固定值0x003F00)

    9)EOI ->End of Image

    含義:圖像結束
    標記碼:0xFFD9 占2字節
    數據流:無

    四、實驗解碼代碼分析

    1、jedc_private結構體

    jdec_private 結構體,其用于指示解碼過程中的所有信息,量化表,霍夫曼碼表以及圖像數據;

    struct jdec_private {//公共變量uint8_t *components[COMPONENTS];unsigned int width, height; // 圖像大小 unsigned int flags;// 私有變量const unsigned char *stream_begin, *stream_end;unsigned int stream_length;const unsigned char *stream; //指向當前流的指針unsigned int reservoir, nbits_in_reservoir;struct component component_infos[COMPONENTS];float Q_tables[COMPONENTS][64]; //量化表struct huffman_table HTDC[HUFFMAN_TABLES]; //DC huffman表struct huffman_table HTAC[HUFFMAN_TABLES]; // AC huffman表int default_huffman_table_initialized;int restart_interval;int restarts_to_go; //在此重新啟動間隔中留下的mcu。int last_rst_marker_seen; //RST標記每次遞增//IDCT之后用于存儲每個組件的臨時空間uint8_t Y[64*4], Cr[64], Cb[64];jmp_buf jump_state;/* Internal Pointer use for colorspace conversion, do not modify it !!! */uint8_t *plane[COMPONENTS];};

    2、compontent結構體

    Component 結構體,其用于參與霍夫曼解碼,反量化,IDCT 以及彩色空間變換,Hfactor和 Vfactor 用于說明水平與垂直的采樣情況。

    struct component {unsigned int Hfactor;unsigned int Vfactor;float *Q_table; // 指向要使用的量化表的指針。struct huffman_table *AC_table;struct huffman_table *DC_table;short int previous_DC; // 前直流系數 short int DCT[64]; // DCT 系數 #if SANITY_CHECKunsigned int cid; #endif };

    3、build_huffman_table函數

    如名可知,是為了構建霍夫曼表:

    static void build_huffman_table(const unsigned char *bits, const unsigned char *vals, struct huffman_table *table) {unsigned int i, j, code, code_size, val, nbits;unsigned char huffsize[HUFFMAN_BITS_SIZE+1], *hz;unsigned int huffcode[HUFFMAN_BITS_SIZE+1], *hc;int next_free_entry;/** 構建臨時數組* huffsize[X] => numbers of bits to write vals[X]*/hz = huffsize;for (i=1; i<=16; i++){for (j=1; j<=bits[i]; j++)*hz++ = i;}*hz = 0;memset(table->lookup, 0xff, sizeof(table->lookup));for (i=0; i<(16-HUFFMAN_HASH_NBITS); i++)table->slowtable[i][0] = 0;/* 構建臨時數組* huffcode[X] => code used to write vals[X]*/code = 0;hc = huffcode;hz = huffsize;nbits = *hz;while (*hz){while (*hz == nbits){*hc++ = code++;hz++;}code <<= 1;nbits++;}/** 建立查找表*/next_free_entry = -1;for (i=0; huffsize[i]; i++){val = vals[i];code = huffcode[i];code_size = huffsize[i];#if TRACEfprintf(p_trace,"val=%2.2x code=%8.8x codesize=%2.2d\n", val, code, code_size);fflush(p_trace);#endiftable->code_size[val] = code_size;if (code_size <= HUFFMAN_HASH_NBITS){/** 可以將Val放在查找表中,因此可以填充此表的所有值* 值為val的列 */int repeat = 1UL<<(HUFFMAN_HASH_NBITS - code_size);code <<= HUFFMAN_HASH_NBITS - code_size;while ( repeat-- )table->lookup[code++] = val;}else{/* Perhaps sorting the array will be an optimization */uint16_t *slowtable = table->slowtable[code_size-HUFFMAN_HASH_NBITS-1];while(slowtable[0])slowtable+=2;slowtable[0] = code;slowtable[1] = val;slowtable[2] = 0;/* TODO: NEED TO CHECK FOR AN OVERFLOW OF THE TABLE */}} }

    4、build_quantization_table函數

    如名可知,是為了構建量化表:

    static void build_quantization_table(float *qtable, const unsigned char *ref_table) {/* Taken from libjpeg. Copyright Independent JPEG Group's LLM idct.* For float AA&N IDCT method, divisors are equal to quantization* coefficients scaled by scalefactor[row]*scalefactor[col], where* scalefactor[0] = 1* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7* We apply a further scale factor of 8.* What's actually stored is 1/divisor so that the inner loop can* use a multiplication rather than a division.*/int i, j;static const double aanscalefactor[8] = {1.0, 1.387039845, 1.306562965, 1.175875602,1.0, 0.785694958, 0.541196100, 0.275899379};const unsigned char *zz = zigzag;for (i=0; i<8; i++) {for (j=0; j<8; j++) {*qtable++ = ref_table[*zz++] * aanscalefactor[i] * aanscalefactor[j];}}//輸出量化表 #if TRACEconst unsigned char* zhi = zigzag;for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {fprintf(p_trace, "%-10d", ref_table[*zhi++]);if (j == 7) {fprintf(p_trace, "\n");}}} #endif}

    5、生成YUV圖像

    snprintf(temp, 1024, "%s.YUV", filename);F = fopen(temp, "wb");fwrite(components[0], width, height, F);fwrite(components[1], width * height / 4, 1, F);fwrite(components[2], width * height / 4, 1, F);fclose(F);

    因為YUV按照全部像素Y數據塊、U數據塊、V數據塊依次存放,且為4:2:0采樣,所以寫入方式為YYYY…,U…,V…;按順序寫入即可

    6、輸出量化矩陣

    量化表是在build_huffman_table函數中建立的,因此在其中加入以下輸出代碼即可輸出量化表:

    //輸出量化表 #if TRACEconst unsigned char* zhi = zigzag;for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {fprintf(p_trace, "%-10d", ref_table[*zhi++]);if (j == 7) {fprintf(p_trace, "\n");}}} #endif

    7、輸出Huffman碼表

    AC和DC的Huffman碼表都是在build_huffman_table函數中完成建立的。因此我們進入這兩個函數,然后對他們進行查看,并輸出碼表。函數中已經寫好:

    #if TRACEfprintf(p_trace,"val=%2.2x code=%8.8x codesize=%2.2d\n", val, code, code_size);fflush(p_trace);#endif

    8、結果分析

    1)生成文件

    由下圖可見,一共生成5個文件,其中output.Y、output.U、output.V是原本生成的Y、U、V分開的數據,因為不方便查看,所以需要增加代碼使其生成.YUV文件以便查看,output.YUV即是生成的.YUV文件;trace_jpeg.txt文件包含了如huffman碼表,量化表等內容。

    2)YUV圖像

    輸出的YUV文件,與原圖像相同,實驗結果正確

    3)量化表

    增加代碼,輸出量化表

    4)huffman表

    由表可知,huffman表是分直流與交流分量,分別有不同的碼表


    鳴謝

    本文參考CSDN博主「翱翔菜鳥」的原創文章
    原文鏈接:JPEG文件格式分析——經典干貨!!!https://blog.csdn.net/hunnanlitong/article/details/106323065

    總結

    以上是生活随笔為你收集整理的实验5_JPEG解码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天堂8在线视频 | 国产婷婷综合 | 福利第一页 | 亚洲不卡中文字幕 | www.sesehu | 黄色aa大片 | 国产第一页屁屁影院 | www.久久爱 | 国产人伦精品一区二区三区 | 一区二区三区波多野结衣 | 日韩精品久久一区 | 国产手机在线视频 | 久久久精品一区二区三区 | 美女吞精视频 | 亚洲av熟女一区 | 国产精品视频在 | 天天操天天干天天摸 | 久草成人在线 | 成人免费视频大全 | 美女久久久久久久久久 | 日本不卡免费 | 免费在线观看毛片视频 | 隣の若妻さん波多野结衣 | 欧美一级特黄aaaaaa大片在线观看 | 日韩极品视频 | 亚洲成人一区二区在线观看 | 天天干夜夜爱 | 欧美男女交配视频 | 7777久久亚洲中文字幕 | 日本成人精品在线 | 黄色专区| 麻豆传媒在线免费 | 狠狠干天天射 | 亚洲国产日韩一区 | 成人在线免费视频观看 | 99热在| 3d动漫精品啪啪一区二区下载 | 亚洲国产日韩精品 | 亚洲欧洲一区二区三区 | av尤物 | 久久伊人成人网 | 超碰九七 | 热久久中文 | 呦呦精品 | 免费在线观看中文字幕 | 九九热只有精品 | 亚洲AV无码AV吞精久久中文版 | 亚洲a∨无码无在线观看 | 无码人妻精品一区二区三区夜夜嗨 | 日韩性猛交ⅹxxx乱大交 | 欧美在线免费视频 | 韩国美女av | 少妇太爽了太深了太硬了 | 黄色网址在线免费播放 | 国产成人精品一区二区在线观看 | 毛片入口 | 亚洲第一区在线播放 | 黄页免费视频 | 校园春色亚洲激情 | 爱爱视频网站 | 欧美一级一级一级 | 亚洲黄色av网站 | 欧美yyy| 日本一区二区三区在线视频 | 黄色在线免费观看视频 | 色网站在线免费观看 | 国产成人免费看一级大黄 | 美女网站全黄 | 国产一级片在线播放 | 日日干狠狠干 | 女人叉开腿让男人桶 | 91禁动漫在线 | 久久久夜| 91成人在线观看喷潮动漫 | 免费人成在线观看视频播放 | 狠狠狠狠狠狠狠干 | 日本成人一二三区 | 黄色日本视频 | 性歌舞团一区二区三区视频 | 日韩av三区 | 久久国产精品影视 | 最新国产精品 | 国产精品久久色 | 美国少妇在线观看免费 | 国产999视频 | 久久久久久久久久艹 | 欧美巨大另类极品videosbest | 免费成人看视频 | 四虎www| 日本在线播放 | 国产精品一区2区 | 国产在线视视频有精品 | www.中文字幕av | 黄色草逼视频 | 日韩免费av一区 | 男人捅爽女人 | 国产精品视频999 | 亚洲精品亚洲 | 热久久伊人|