matlab dct稀疏系數,Matlab DCT詳解

轉自:http://blog.csdn.net/ahafg/article/details/48808443

DCT變換

DCT又稱離散余弦變換,是一種塊變換方式,只使用余弦函數來表達信號,與傅里葉變換緊密相關。常用于圖像數據的壓縮,通過將圖像分成大小相等(一般為8*8)的塊,利用DCT對其進行變換,得到更加簡潔的數據。因為圖像像素間存在較大的空間相關性,DCT可以大大減小這些相關性,使圖像能量集中在左上角區域,從而利于數據壓縮。變換后得到的數據稱為DCT系數。這一過程是無損的。

二維DCT變換

這里來看看二維DCT變換的公式:

0818b9ca8b590ca3270a3433284dd417.png

c(u)和c(v)為添加的系數,主要作用為使DCT變換矩陣為正交矩陣。F(u,v)即為DCT變換系數,可以通過矩陣形式來表示:

0818b9ca8b590ca3270a3433284dd417.png

A即為正交矩陣,通過F和A逆變換即可恢復圖像數據。

下面通過一個例子來說明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17clear;

clc;

I = [12,23,53,16;42,16,68,45;34,62,73,26;72,15,34,28]; %數據塊

A = zeros(4); %變換矩陣A,也可以通過函數dctmtx(n)求得

for i = 0:3

for j = 0:3

if i == 0

a = sqrt(1/4);

else

a = sqrt(2/4);

end

A(i+1,j+1) = a*cos((j+0.5)*pi*i/4)

end

end

D = A*I*A'; %DCT變換

D1 = dct2(I); %matlab DCT函數進行DCT變換

D2 = A'*D*A; %DCT逆變換

0818b9ca8b590ca3270a3433284dd417.png

由結果可以看出,D,D1方式得到的DCT系數相同,說明矩陣形式的DCT變換公式是正確的,D2的數據與原數據I相同,實現了數據恢復。

另外通過運行函數dctmtx(4)可以發現得到的變換矩陣與A完全相同。

Matlab 函數實現

matlab實現離散余弦變換有兩種方法:

一種為函數dct2( ), 使用函數dct2,該函數用一個基于FFT的算法來提高當輸入較大的方陣時的計算速度。

另一種為函數dctmtx( ), 使用由dctmtx函數返回的DCT變換矩陣,這種方法較適合于較小的輸入方陣(例如8×8或16×16)。

1. 函數:dct2( )

實現圖像的二維離散余弦變換。調用格式為:? B = dct2(A)? B = dct2(A,[M N])? B = dct2(A,M,N)? 式中A表示要變換的圖像,M和N是可選參數,表示填充后的圖像矩陣大小,B表示變換后得到的圖像矩陣。其逆變換函數為idct2( );? 代碼如下:

1

2

3

4

5I = imread('1_1.jpg');%輸入灰度圖像

D = dct2(I); %DCT變換

D1 = idct2(D); %逆變換

subplot(1,2,1);imshow(I);

subplot(1,2,2);imshow(uint8(D1));

在這里可以通過函數colormap查看變換系數D。利用不同灰度值,可以發現D中主要數據都分布在左上角。

1

2

3imshow(log(abs(D)),[]);

colormap(gray(8));colorbar;

2. 函數:dctmtx( )

D = dctmtx(N)? 式中D是返回N×N的DCT變換矩陣,如果矩陣A是N×N方陣,則A的DCT變換可用D×A×D’來計算。這在有時比dct2計算快,特別是對于A很大的情況。上面有提到過。

對于圖像的DCT變換,這里還需用到一個函數blkproc( ),其功能為對圖像分塊進行DCT變換。? blkproc( )定義如下:? B = blkproc(A,[M N],Fun) ,A為輸入圖像,M*N為塊大小,Fun為處理函數? 常用的方式為:? B = blkproc(A,[8,8],’P1*x*P2’,T,T’); T為變換矩陣,P1和P2為參數,代表T*x*T’ 。

下面為應用例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40I = imread('1_1.jpg'); %輸入灰度圖像

I = im2double(I);

D = dctmtx(8);

C = blkproc(I,[8,8],'P1*x*P2',D,D'); %D'為D的轉置

mask1=[1 1 1 1 1 0 0 0

1 1 1 1 0 0 0 0

1 1 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0];

mask2=[1 1 1 1 0 0 0 0

1 1 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0];

mask3=[1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0];

X = blkproc(C,[8,8],'P1.*x',mask1); %保留15個系數

I1 = blkproc(X,[8,8],'P1*x*P2',D',D); %重構圖像

X2 = blkproc(C,[8,8],'P1.*x',mask2); %保留10個系數

I2 = blkproc(X2,[8,8],'P1*x*P2',D',D); %重構圖像

X3 = blkproc(C,[8,8],'P1.*x',mask3); %保留3個系數

I3 = blkproc(X3,[8,8],'P1*x*P2',D',D); %重構圖像

subplot(2,4,1);imshow(I);

subplot(2,4,2);imshow(I1);

subplot(2,4,3);imshow(I2);

subplot(2,4,4);imshow(I3);

上面代碼中,通過求得圖像DCT系數,利用mask等矩陣對其進行量化,保留左上角主要的系數值,對于右下角的值由于其為非常小的高頻系數,量化去除后對于圖像的質量影響不大,可以利用這一性質對圖像進行壓縮處理。

保留系數越多則圖像壓縮質量越好,下面比較幾幅圖像質量,從左到右分別為原圖,mask1,mask2,mask3;

0818b9ca8b590ca3270a3433284dd417.png

可以看到系數保留越少,則圖像質量越差。

DCT變換這次就講到這了。

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

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

相關文章

matlab驗潮站,驗潮站的作用是什么

驗潮站的作用是什么?驗潮站的建成投入使用,可實時觀測沿海潮汐等觀測要素,為潮汐預報、赤潮的發生、風暴潮預警報、海嘯預警及海平面變化提供基礎數據保障以及預測,同時為科學開發海洋提供有力的支持,為海洋經濟健康發展保駕護航…

答題闖關php,成語答題闖關紅包流量主小程序源碼

修復紅包頁面提現提示文字得疊的問題限制過關紅包每天領取個數左側影響美觀的小程序鏈接的文字去掉了增加版本號沒有問題的可以暫不更新此版本修復前一版本客服提現沒有授權的問題管理后臺增加主動推送客服消息(紅包)給用戶的功能,喚醒用戶使用自定義分享的配置增加…

php是音頻嗎,只要是用PHP和JS發布的HTML5是否可以播放音頻?

我正在嘗試創建一個可以上傳播客的頁面。我想擁有“發布”或“取消發布”的能力。我讓每個播客添加到一個數據庫中,包含它的信息和發布列,可以是真是假。目前我使用以下代碼PHP:if(isPublished()){header(Cache-Control: max-age100000);header(Content-Transfer-Encoding: bin…

php收購,php中文網收購全國用戶量最大的phpstudy集成開發環境揭秘

phpstudy介紹2008年第一個版本誕生,至今已有9年,該程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安裝,無須配置即可使用,是非常方便、好用的PHP調試環境.該程序不僅包括PHP調試環境,還包括了開發工具、開發手冊等.總之學習PHP只需一個包…

復雜電網三相短路計算的matlab仿真,復雜電網三相短路計算的MATLAB仿真電力系統分析課設報告 - 圖文...

XG?XT**35.3100??0.11003000.856100???0.05100120發電廠B:XG?XT**17.65100 ??0.051003000.853100???0.025100120發電廠H:XG?XT**17.65100??0.051003000.8512100???0.1100120變電站C:3.6100*XT???0.03100120 線路&#x…

php 將多個數組 相同的鍵重組,PHP – 合并兩個類似于array_combine但具有重復鍵的數組...

你可以使用array_map:$arrKeys array(str, str, otherStr);$arrVals array(1.22, 1.99, 5.17);function foo($key, $val) {return array($key>$val);}$arrResult array_map(foo, $arrKeys, $arrVals);print_r($arrResult);Array([0] > Array([str] > 1.…

C php反序列化,php反序列化漏洞 - anansec的個人空間 - OSCHINA - 中文開源技術交流社區...

反序列化本身是沒有漏洞的,但是當反序列化和一些魔術方法結合使用時就可能會產生安全風險。常用的魔術方法__wakeup反序列化漏洞示例(__wekeup)class A{var $test "demo";function __wakeup(){eval($this->test);}}$b new A();$c serialize($b);$a …

oracle lob值是什么,關于Oracle數據庫LOB大字段總結

概述在ORACLE數據庫中,DBA_OBJECTS視圖中OBJECT_TYPE為LOB的對象是什么東西呢?其實OBJECT_TYPE為LOB就是大對象(LOB),它指那些用來存儲大量數據的數據庫字段。Oracle 11gR2 文檔:http://download.oracle.com/docs/cd/E11882_01/Ap…

php 統計目錄大小,PHP 統計目錄大小

例01:function dirsize($dir){$size0;//打開目錄$ddopendir($dir); //--opendir("")打開一個目錄,返回此目錄的資源句柄readdir($dd); //--通過讀兩次,來跳過特殊目錄"."、".."readdir($dd);//遍歷目錄累加大小while($f …

oracle03206,ORACLE數據庫創建表空間ORA-03206報錯的解決方案

Oracle的數據文件大小是有限制的,今天在創建表空間的時候就遇到了問題,限制很簡單,作為DBA必須要了解。測試環境:操作系統:Win7 64位專業版數據庫版本:64位Oracle10.2.0.4DB_NAME:hoegh表空間名…

oracle sql server的區別,oracle與sqlserver的十大區別

http://blog.csdn.net/it_fengli/article/details/8213839 --sql server 與 oracle的區別: --DBMS 數據庫管理系統 --1.數據類型不同。 --sql server 的數據類型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima…

Oracle19C的dbhome,Windows server 安裝Oracle19c (WINDOWS.X64_193000_db_home.zip) 過程碰到的問題總結...

Oracle19c的下載地址:鏈接: https://pan.baidu.com/s/1snqyViOAoeffAztPes_Tvw提取碼: 9kb6Oracle19c的安裝過程:解壓縮安裝包:解壓結果 以管理員方式運行setup開始安裝 一直默認走到安裝完成即可創建用戶cmd執行sqlplus命令,輸入…

oracle01537,ORACLE REUSE實驗

一、查看數據文件位置SQL> show user;User is "SYS"SQL> desc dba_data_files;Name Type Nullable Default Comments--------------- ------------- -------- ------- ---------------------------------------------------FILE_NAME …

oracle數據庫配置管理,Oracle配置管理

一、連接Oracle1、Oracle建立連接的過程無論是通過sqlplus命令連接還是第三方工具遠程連接到Oracle,都需要建立客戶端與服務端之間的連接。Oracle Net Service組件就是為了用于建立連接的,這個組件在安裝Oracle時已經安裝。1)在服務器端有一個listener監…

oracle 插入一個語句,oracle如何通過1條語句插入多個值 oracle通過1條語句插入多個值方法...

本篇文章小編給大家分享一下oracle通過1條語句插入多個值方法,小編覺得挺不錯的,現在分享給大家供大家參考,有需要的小伙伴們可以來看看。在實踐過程中遇到一個問題,我想往數據庫插入多條數據時,使用了如下語句&#x…

linux內核 默認路由表,[Linux] linux路由表-Go語言中文社區

路由表用于決定數據包從哪個網口發出,其主要判斷依據是目標IP地址Linux路由表其實有2個主要概念:按順序走路由策略,在路由策略對應的路由表中匹配規則路由策略(rule)路由表(table)查看所有的路由策略,32766那個策略最有用,對應的main路由表也是默認展示的…

linux添加源地址ping,實戰經驗:Linux Source NAT在Ping場景下的應用

原標題:實戰經驗:Linux Source NAT在Ping場景下的應用有時候,有這樣的一種需求:需要修改IP數據包中的源地址,比如,從某一個主機發送Ping包到另一個主機,需要修改源地址為另一個源(通常&#xff…

mac遠程linux的ide,Jupyter notebook在mac:linux上的配置和遠程訪問

IPython 和 JupyterIPython 通常指的是一個 Python REPL(交互式解釋器) shell。提供了遠比 Python shell 強大的 shell 環境。IPython 是 Iteractive Python shell的縮寫。 Notebook 是一個基于 IPython 的 web 應用。截止 IPython 3.0 ,IPython 變得越來越臃腫&…

Linux升級glibc版本漢字亂碼,Linux CentOS6升級glibc庫過程

CentOS6升級glibc庫過程hadoop無法加載native庫,可能原因是 glibc庫版本過低,需要升級。第一:安裝以下軟件yum -y install zlib zlib-devel gcc gcc-c libtool openssl openssl-devel automake autoconf libtool pcre*第二、查看系統glibc版本…

linux圖形界面 革命,Windows 95帶來的革命

CDECDE1993年6月-在“公用桌面環境“是與Sun,惠普,IBM和合資Unix系統實驗室。CDE,通用桌面環境(CommonDesktopEnvironment)的縮寫。CDE是一種運行于UNIX,基于Motif部件工具箱開發的商業桌面環境。惠普的OpenVMS采用CDE作為標準的桌…