數字圖像處理——圖像壓縮

背景

圖像壓縮是一種減少圖像文件大小的技術,旨在在保持視覺質量的同時降低存儲和傳輸成本。隨著數字圖像的廣泛應用,圖像壓縮在多個領域如互聯網、移動通信、醫學影像和衛星圖像處理中變得至關重要。

技術總覽

當下圖像壓縮JPEG幾乎一統天下,本文主要依據其原理,進行解析。

工作流總覽

  1. 顏色空間(YUV)下采樣
  2. 分塊DCT
  3. 依據量化表進行DCT量化
  4. zigzag掃描
  5. RLE編碼
  6. Huffman編碼
  7. 上述過程反向進行,解壓縮

顏色空間下采樣

關于YUV空間一些基礎知識:

https://zhuanlan.zhihu.com/p/587189669https://zhuanlan.zhihu.com/p/587189669其中Y空間也稱灰度空間,直方圖均衡化、灰度拉伸等操作就是基于這個空間進行的,很多時候,為了圖像處理的簡潔,經常在該空間上進行操作。

將顏色空間RGB轉化為YUV之后,由于人眼主要對Y(亮度)敏感,而對UV空間不敏感,所以可以對UV空間進行下采樣,(這里對UV空間體積分別縮小到原來的1/4),以512 * 512尺寸的RGB圖片為例。僅一步顏色空間下采樣,存儲空間就壓縮為了原本的?

(512*512 + 256*256 + 256*256)/ 512*512*3 = 1/2

分塊DCT

關于dct的一些相關知識??

https://zhuanlan.zhihu.com/p/85299446https://zhuanlan.zhihu.com/p/85299446dct將空域轉化成等價的頻域, 在頻域中,人眼對高頻的信息不敏感,那么如果略去高頻,保留低頻,則實現了圖像的有損壓縮。

dct僅僅是一步變換而已,并不對圖像構成壓縮,真正起到壓縮效果的是量化 + 編碼(也即接下來兩步)

為何分塊?

全局dct當然可以完成任務,并且壓縮效果依舊十分優異。但分塊后的好處是明顯的

從空間上來說:有固定分塊更容易研究量化表,讀者仔細思考就會發現,對于任意尺寸的dct二維數組,去用函數生成量化表是困難的,但是如果行業定下一個固定的dct二維數組尺寸,大家就可以盡情研究這個條件下什么樣的量化表效果會比較好。

從時間上來說:進行分塊后,計算的總體時間比整體計算快很多。在此之外,對于8*8分塊的dct,也有很多研究其快速算法的,ANN算法就是其中典例。

DCT矩陣量化

這一步的根本目標就是把DCT的高頻部分消去。

具體的計算步驟為,DCT矩陣的元素處以量化矩陣的對應位置元素

讀者的困惑應該大多在于量化表的生成。 關于這一點,對于任意M*N尺寸的圖片,其量化表可以設計一個指數函數去表達, 其中k的值應當偏小,對于512 * 512的lena圖來說,筆者嘗試值為0.4效果較佳。當然,如果真使用冪函數,記得在最外加上1,防止在0位置除0

????????

Zigzag掃描

JPEG圖像壓縮探索_zigzag掃描(原創)-CSDN博客文章瀏覽閱讀2k次。文章詳細介紹了DCT變換后如何使用zigzag掃描算法將圖像數據從高頻到低頻有序地轉化為一維數據,以便于后續的霍夫曼編碼等操作。該方法允許在不知原始二維數據邊長的情況下,將二維數據轉換為一維并能恢復原狀。文中還提供了Java代碼示例來實現這一過程。 https://blog.csdn.net/cjzjolly/article/details/129158254

借上方博客圖一用,zigzag掃描順序如上圖所示,其中“掃描”的目的是為了把二維數組轉一維數組,方便進一步編碼壓縮,采用“zigzag”順序的理由是,這樣掃描讓盡可能多的‘0’ 靠在了一起,為隨后的RLE編碼提供基礎。

RLE編碼

關于該編碼,下邊這篇講的挺不錯。

https://zhuanlan.zhihu.com/p/1892905961586405848https://zhuanlan.zhihu.com/p/1892905961586405848經過RLE之后,就把重復很多的0給去除了 (其實這一點的效用和Huffman編碼稍微有點打架,因為如果沒有RLE,在量化后DCT矩陣的Huffman編碼中,最主要能節省的空間就是重復的0)

Huffman編碼

Huffman編碼的知識??

Huffman 編碼原理詳解(代碼示例)_霍夫曼解碼原理-CSDN博客文章瀏覽閱讀2.9w次,點贊19次,收藏47次。本文介紹了Huffman編碼的基本原理,包括路徑長度、帶權路徑長度等概念,并詳細闡述了Huffman樹的構造過程及其編碼實現。通過實例展示了如何選擇最優二叉樹以獲得最短編碼。 https://blog.csdn.net/qinglongzhan/article/details/80982067關于該編碼壓縮空間的機理:

我們知道一個int在存儲空間占用4個字節 32位, 但是如果使用編碼的方式以字節流存入,則根本用不了32位,在解碼的時候只需保留Huffman的編碼表即可。

在調試這一段代碼的實踐中筆者其實廢了挺多力氣,因為按字節流存入,再讀取的時候由于不清楚大端讀還是小端讀導致調試的一頭霧水。

解碼過程

整體的解碼過程,按上方流程反過來走一遍即可達成完整解碼的效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81540.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抖音視頻怎么去掉抖音號水印

你是不是經常遇到這樣的煩惱?看到喜歡的抖音視頻,想保存下來分享給朋友或二次創作,卻被抖音號水印擋住了畫面?別著急,今天教你幾種超簡單的方法,輕松去除水印,高清無水印視頻一鍵保存&#xff0…

RISC-V 開發板 MUSE Pi Pro PCIE 測試以及 fio 崩潰問題解決

視頻講解: RISC-V 開發板 MUSE Pi Pro PCIE 測試以及 fio 崩潰問題解決 板子上有一個m.2的pcie插槽,k1有三個pcie控制器,pcie0和usb3復用一個phy,所以實際開發板就兩個,測試的話,上一個nvme硬盤&#xff0c…

超級管理員租戶資源初始化與授權管理設計方案

背景說明 在多租戶系統中,資源(如功能模塊、系統菜單、服務能力等)需按租戶維度進行授權管理。超級管理員在創建新租戶時,需要初始化該租戶的資源授權信息。 兩種可選方案 方案描述方案 A:前端傳入選中的資源列表創…

stm32week16

stm32學習 十一.中斷 4.使用中斷 EXTI的配置步驟: 使能GPIO時鐘設置GPIO輸入模式使能AFIO/SYSCFG時鐘設置EXTI和IO對應關系設置EXTI屏蔽,上/下沿設置NVIC設計中斷服務函數 HAL庫的使用: 使能GPIO時鐘:__HAL_RCC_GPIOx_CLK_EN…

什么是RDMA?

什么是RDMA? RDMA(RemoteDirect Memory Access)技術全稱遠程直接內存訪問,就是為了解決網絡傳輸中服務器端數據處理的延遲而產生的。它將數據直接從一臺計算機的內存傳輸到另一臺計算機,無需雙方操作系統的介入。這允許高吞吐、低延遲的網絡…

golang 安裝gin包、創建路由基本總結

文章目錄 一、安裝gin包和熱加載包二、路由簡單場景總結 一、安裝gin包和熱加載包 首先終端新建一個main.go然后go mod init ‘項目名稱’執行以下命令 安裝gin包 go get -u github.com/gin-gonic/gin終端安裝熱加載包 go get github.com/pilu/fresh終端輸入fresh 運行 &…

【數據結構篇】鏈式結構二叉樹

目錄: 一 二叉鏈的概念與結構: 1.1 概念: 1.2 結構: 二 二叉鏈的實現: 2.1 二叉樹的構建: 2.2 二叉樹的遍歷: 2.2.1 前序遍歷: 2.2.2 中序遍歷: 2.2.3 后序遍歷…

【MySQL】02.數據庫基礎

1. 數據庫的引入 之前存儲數據用文件就可以了,為什么還要弄個數據庫? 文件存儲存在安全性問題,文件不利于數據查詢和管理,文件不利于存儲海量數據,文件在程序中控制不方便。而為了解決上述問題,專家們設計出更加利于…

什么是 Langchain 以及其核心組件

LangChain 官方文檔:LangChain 一、什么是Langchain LangChain 是一個用于構建基于LLM的應用框架,它提供了對 LLM API 的封裝和擴展,使開發者能夠更方便地構建復雜的應用。 個人理解:用類比的方法來說,LangChain類似…

博客系統功能測試

博客系統網址:http://8.137.19.140:9090/blog_list.html 主要測試內容 功能測試、界面測試、性能測試、易用性測試、安全測試、兼容性測試、弱網測試、安裝卸載測試、壓力測試… 測試方法及目的 利用selenium和python編寫測試腳本,對博客系統進行的相關…

項目制作流程

一、使用 CRA 創建項目 npx create-react-app name 二、按照業務規范整理項目目錄 (重點src目錄) 三、安裝插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基礎路由 Router 1. 安裝路由包 react-router-dom …

ngx_http_random_index_module 模塊概述

一、使用場景 隨機內容分發 當同一目錄下存放多份等價內容(如多張輪播圖、不同版本靜態頁面等)時,可通過隨機索引實現負載均衡或流量分散。A/B 測試 通過目錄請求自動隨機分配用戶到不同測試組,無需后端邏輯參與。動態“首頁”選…

智能權限守護者:基于Python描述符的動態角色控制實現

智能權限守護者:基于Python描述符的動態角色控制實現 引言:當描述符遇見權限管理 在Python的魔法方法體系中,描述符(Descriptor)以其優雅的屬性訪問控制機制著稱。當我們將描述符與RBAC(基于角色的訪問控制)模型結合,就能創造出既靈活又安全的動態權限管理系統。本文…

Linux 的 UDP 網絡編程 -- 回顯服務器,翻譯服務器

目錄 1. 回顯服務器 -- echo server 1.1 相關函數介紹 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服務端的封裝 -- UdpServer.hpp 1.3 服務端代碼 -- UdpServer.cc 1.4 客戶端代碼 -- UdpClient.…

Linux 內核等待機制詳解:prepare_to_wait_exclusive 與 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函數解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 內核中用于將進程以獨占方式加入等待隊列的關鍵函數,其主要功能包括: 標記獨占等待:通過設置 WQ_FLAG_EXCLUSIVE 標志,表明此等待條目是獨占的。 安全入隊:在自旋鎖保護下,將條…

【Android構建系統】了解Soong構建系統

背景介紹 在Android7.0之前,Android使用GNU Make描述和執行build規則。Android7.0引入了Soong構建系統,彌補Make構建系統在Android層面變慢、容易出錯、無法擴展且難以測試等缺點。 Soong利用Kati GNU Make克隆工具和Ninja構建系統組件來加速Android的…

信息學奧賽一本通 1539:簡單題 | 洛谷 P5057 [CQOI2006] 簡單題

【題目鏈接】 ybt 1539:簡單題 洛谷 P5057 [CQOI2006] 簡單題 【題目考點】 1. 樹狀數組 模板題及講解:洛谷 P3374 【模板】樹狀數組 【解題思路】 解法1:樹狀數組 該有01構成數組初值都為0。 某位置的元素被修改奇數次后值為1&#x…

倉頡開發語言入門教程:搭建開發環境

倉頡開發語言作為華為為鴻蒙系統自研的開發語言,雖然才發布不久,但是它承擔著極其重要的歷史使命。作為鴻蒙開發者,掌握倉頡開發語言將成為不可或缺的技能,今天我們從零開始,為大家分享倉頡語言的開發教程,…

玉米籽粒發育

成熟玉米籽粒的結構 玉米籽粒的組成 成熟的玉米籽粒主要由以下三部分組成: 母體組織:包括種皮、胎座和花梗。種皮由珠被發育而來,起到保護種子的作用,并在種子的休眠和萌發中發揮重要作用。胚:包含根分生組織、莖分…

sherpa-ncnn:音頻處理跟不上采集速度 -- 語音轉文本大模型

目錄 1. 問題報錯2. 解決方法 1. 問題報錯 報錯: An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…