基礎知識
脆弱水印
水印加入載體后,提取不出來,即載體是無效的。
載體圖像的任何修改都能被識別出
半脆弱水印
載體圖像可以接受常規的修改,例如:格式轉換、去燥等
信息隱藏
秘密信息是不可見的,且不影響載體的使用
加密后的密文是可見的,但看不懂
關鍵詞
Information Hiding (信息隱藏)
Steganography(隱寫)
Steganalysis(隱寫分析)
Digital Watermarking(數字水印)
時域|空域|頻域
1、空間域
也叫空域,即像素域,在空域的處理就是在像素級的處理,如在像素級的圖像疊加,通過傅里葉變換后,得到的是圖像的頻譜,表示圖像的能量梯度
2、頻率域
任何一個波形都可以分解成多個正弦波之和,每個正弦波都有自己的頻率和振幅,所以任何一個波形信號有自己的頻率和振幅的集合,頻率域就是空間域經過傅里葉變換的信號
3、時域
時間域,自變量是時間,即橫軸是時間,縱軸是信號的變化,其動態信號 x(t) 是描述信號在不同時刻取值的函數
4、頻域
頻率域,自變量是頻率,即橫軸是頻率,縱軸是該頻率信號的振幅,也就是頻譜圖,描述了信號的頻率結構及頻率與該頻率信號振幅的關系
傅里葉變換是實現空域或時域到頻域的轉換工具
傅里葉變換
傅里葉指出:“任何周期函數都可以表示為用頻率的正弦和、或余弦之和的形式【傅里葉級數】,每個正弦項和、或余弦項乘以不同的系數”
甚至非周期函數,也可以用頻率的正弦和、或余弦乘以加權函數的積分來表示,這種情況叫做“傅里葉變換”
具體參考:鏈接
數字水印
主要用於版權保護
工作流程
常用攻擊
1、裁減攻擊
2、划線攻擊
3、編碼攻擊
4、縮放攻擊
5、旋轉攻擊
應用領域
1、廣播監控
2、版權保護
3、盜版追蹤
4、內容認證
5、拷貝控制
信息隱藏
兩個主要分支:數字水印、隱寫術
隱寫術主要用於保密通信
常見的應用:
隱蔽信道
隱蔽信道是相對於公開信道而言的,和公開信道一起使用,公開信道上傳輸的信息,是隱蔽信道上的載體
例:TCP協議頭中保留字段可以用於攜帶秘密信息
偽裝式保密通信
將秘密信息隱藏在正常傳輸的信息中
目的:不引起注意
加密:容易引起注意
可視密碼
把要隱藏的秘鑰信息通過算法隱藏到兩個或多個子秘鑰圖片中
每張圖片都有隨機分布的黑點和白點
把所有的信息疊在一起,就能恢復出原有的信息
特點:回復秘密圖像時不需要任何復雜的計算,直接觀察就可分辨
舉例:
1、基於像素擴展的秘密分享
(2*2分享)
2、基於圖像分解的秘密分享
圖像取證
鑒定圖像來源、圖像完整性等
感知哈希
由圖像數據集到圖像感知摘要集的一個簡單地單項映射,是對圖像感知信息的簡短摘要
利用哈希的摘要性、單向性和抗碰撞性,對內容操作具有魯棒性,對內容篡改有敏感性
用於圖像內容的識別和認證
數字信封
數字信封:將對稱秘鑰通過非對稱加密(公鑰和私鑰)的結果分發對稱秘鑰的方法
數字信封包含:被加密的內容和被加密的用於加密該內容的秘鑰,經常用接收方的公鑰來加密秘鑰
性能指標
1、透明性
不可感知性,反映對原始信息的改變程度【PSNR值】
2、魯棒性
抗攻擊性,收到攻擊后提取信息的正確率【BER、NC】
3、容量
嵌入1bit信息需要的載體信息bit【1bit 水印信息/nbit載體信息】
4、三者關系
容量增加,魯棒性不變,透明性下降
容量減少,魯棒性不變,透明性增加
容量不變,魯棒性增加,透明性下降
容量不變,魯棒性降低,透明性增加
隱寫術
隱寫系統
載體介紹
1、存在冗余空間的載體
比如:圖像,音頻等,在冗余空間修改修改
2、沒有冗余空間的載體
如文本等
3、載體特點
同一載體不應被使用兩次,否則會重構秘密信息,破壞秘密信息
隱寫系統分類
1、無秘鑰隱寫系統
2、私鑰隱寫系統
是對稱的
3、公鑰隱寫系統
是非對稱的
公鑰和私鑰的結合1:
公鑰和私鑰的結合2:
遭遇第三方攻擊時:
性能指標
1、容量
負載,指載體數據利用率,嵌入效率
2、不可感知性
透明性 | 保真性:
3、健壯性
魯棒性、健壯性
4、安全性
統計不可檢測性
信號處理
人能感知的聲音頻率為:16HZ~16KHZ
掩蔽效應
強信號掩蓋弱信號
模擬信號
連續
數字信號
計算機能夠表示,存儲的信號
數字信號如何表示模擬信號?
1、抽樣
單位時間內抽樣點數夠多
采樣頻率【HZ】:
由奈奎斯特采樣定律知:當采樣頻率滿足一定要求時,數字信號能完整保留原始信號信息
2、量化
3、編碼
對采樣所得信息進行編碼,產生碼流單位 b/s
音頻文件格式
1、WAV
例:
語音評價
主觀評價
平均意見分(MOS,Mean Option Score)
客觀評價
比較波形差別:SNR值
例:計算SNR值
信號變換
變換域操作:
1、DFT:離散傅里葉變換
2、DCT:離散余弦變換
3、DWT:離散小波變換
圖像處理
基礎知識
1、圖像的表示
圖像是由像素(pixel)組成,像素存儲為矩陣
2、圖像分辨率
指的是圖像中像素的個數,例:1024*768,表示圖像每行有1024個像素,每列有768個像素
3、圖像類型
(1)灰度圖像(8位)
圖像每個像素大小為(0黑~255白)的灰度值(gray value)
每個像素用1個字節表示
(2)24位彩色圖像
每個像素用三個字節表示,即像素顏色的紅、藍、綠分量
(3)索引圖像
每個像素存儲一個調色板索引值
調色板每條記錄表示一個顏色(調色板中存儲的值是歸一化后的)
(4)二值圖像
也叫黑白圖像,像素值為0或者1,對應顏色為黑色和白色
4、圖像文件格式
(1)文件頭
包含圖像的自我說明,即維數、類型、創建時間和標題等,也可以包含用於解釋像素值的顏色表和編碼表
(2)圖像數據
像素顏色值或壓縮后的數據
(3)常見的文件格式
(4)BMP位圖文件
** 文件頭
** 信息頭
** 例
(5)JPEG
全稱:Joint Photographic Experts Group ,聯合圖片專家組開發,用於彩色圖像的存儲和網絡傳輸
特點:
采用有損壓縮編碼,數據量小
核心技術:DCT、量化、熵編碼
要點:
用於保存表現自然景觀的圖像
用於網絡傳輸
不適於表現有明顯邊界的圖像
不適於高質量印刷文件
(6)GIF
全稱:Graphics Interchange Format,CompuServe公司開發,用於屏幕顯示和網絡
特點:
具有87a、89a兩種格式:87a描述單一靜止圖像;89a表示多幀圖像
采用改進的LZW壓縮算法
彩色模式:28 ,分辨率:96dpi
使用:
屏幕顯示圖片和電腦動畫
用於網絡傳輸
不適於保存高質量印刷文件
(7)TIFF
全稱:Tag Image File Format,標記圖像文件格式,Aldus公司開發,用於精准描述圖像的場合
特點:
文件描述單一(靜止)圖像
彩色模式:21(單色)~232
支持多平台
采用多種壓縮數據格式
(8)PNG
全稱:Portable Network Graphic Format,便攜式網絡圖形格式
特點:
支持索引、灰度、RGB三顏色以及Appha通道
灰度圖像的深度最多16位,彩色深度最多48位,可存儲最多16位$\alpha $通道數據
采樣無損壓縮
使用:
用於平面設計、網絡傳輸
5、圖像質量評價
客觀評價
(1)均方誤差(MSE,Mean Square Error)
PS:M*N指像素點的個數
(2)平均絕對誤差(MAE,Mean Absolute Error)
(3)峰值信噪比(PSNR,Peak Signal to Noise Ratio)
可以表示圖像的平均修改程度,PSNR值越小,影響越大,一般大於30DB
缺點:評價結果有時與主觀感覺不同
(4)例:計算PSNR
圖像變換
1、DFT:離散傅里葉變換
更多參考:鏈接
二維傅里葉公式:
Matlab函數:
(1)Y=fft(X)
fft - 快速傅里葉變換 此 MATLAB 函數 用快速傅里葉變換 (fft) 算法計算 X 的離散傅里葉變換 (DFT)。 如果 X 是向量,則 fft(X) 返回該向量的傅里葉變換。 如果 X 是矩陣,則 fft(X) 將 X 的各列視為向量,並返回每列的傅里葉變換。 如果 X 是一個多維數組,則 fft(X) 將沿大小不等於 1 的第一個數組維度的值視為向量,並返回每個向量的傅里葉變換。 Y = fft(X) Y = fft(X,n) Y = fft(X,n,dim)
(2)Y=ifft(X)
ifft - 快速傅里葉逆變換 此 MATLAB 函數 使用快速傅里葉變換算法計算 Y 的逆離散傅里葉變換。X 與 Y 的大小相同。 如果 Y 是向量,則 ifft(Y) 返回該向量的逆變換。 如果 Y 是矩陣,則 ifft(Y) 返回該矩陣每一列的逆變換。 如果 Y 是多維數組,則 ifft(Y) 將大小不等於 1 的第一個維度上的值視為向量,並返回每個向量的逆變換。 X = ifft(Y) X = ifft(Y,n) X = ifft(Y,n,dim) X = ifft(___,symflag)
(3)Y=fft2(X)
fft2 - 二維快速傅里葉變換 此 MATLAB 函數 使用快速傅里葉變換算法返回矩陣的二維傅里葉變換,這等同於計算 fft(fft(X).').'。如果 X 是一個多維數組,fft2 將采用高於 2 的每個維度的二維變換。輸出 Y 的大小與 X 相同。 Y = fft2(X) Y = fft2(X,m,n)
(4)Y=ifft2(X)
ifft2 - 二維快速傅里葉逆變換 此 MATLAB 函數 使用快速傅里葉變換算法返回矩陣的二維離散傅里葉逆變換。如果 Y 是一個多維數組,則 ifft2 計算大於 2 的每個維度的二維逆變換。輸出 X 的大小與 Y 相同。 X = ifft2(Y) X = ifft2(Y,m,n) X = ifft2(___,symflag)
(5)Y=fftshift(X):轉換后,低頻處在四個角上,用此函數將其歸為中心
fftshift - 將零頻分量移到頻譜中心 此 MATLAB 函數 通過將零頻分量移動到數組中心,重新排列傅里葉變換 X。 Y = fftshift(X) Y = fftshift(X,dim)
(6)Y=ifftshift(X)
ifftshift - 逆零頻平移 此 MATLAB 函數 將進行過零頻平移的傅里葉變換 Y 重新排列回原始變換輸出的樣子。換言之,ifftshift 就是撤消 fftshift 的結果。 X = ifftshift(Y) X = ifftshift(Y,dim)
實驗1:
image=imread('input.jpg'); grayI=rgb2gray(image); dft1=fft2(grayI); adft1=abs(dft1); top=max(adft1(:));
% 為了能更好觀察頻域數據,把范圍做調整 bottom=min(adft1(:)); adft1=(adft1-bottom)/(top-bottom)*100; adft2=fftshift(adft1); figure; subplot(131),imshow(image),title('原圖'); subplot(132),imshow(adft1),title('原頻譜圖'); subplot(133),imshow(adft2),title('移位頻譜圖');%將低頻移到中間
常見的圖形進行傅里葉變換,可以大致反映出圖形的特征:
DFT的性質:
平移圖像后,頻譜基本一樣:
旋轉圖像,頻譜也對應旋轉:
低通和高通:
低通:將距離中心較遠的信息直接去掉,“類似加一個塊“
低通的參數越大,圖像越模糊
將四周的信息全部去掉,圖像會模糊的更自然點:
高通:將中間的一部分信息去掉,“類似這樣:”
高通的參數越大,圖像亮度越低:
2、DCT:離散余弦變換
更多參考:鏈接
二維余弦變換:
對圖片進行DCT變換,能量主要集中在左上角低頻分量處:
Matlab函數:
1、Y=dct(X)
2、Y=idct(X)
3、Y=dct2(X)
4、Y=idct2(X)
實驗1:
image=imread('input.jpg'); grayI=rgb2gray(image); dct1=dct2(grayI); adct1=abs(dct1); top=max(adct1(:)); bottom=min(adct1(:)); adct1=(adct1-bottom)/(top-bottom)*100; figure; subplot(131),imshow(image),title('原圖'); subplot(132),imshow(adct1),title('DCT頻譜圖');
應用:
DCT常用於圖像信號處理,例:JPEG圖像壓縮
圖像不同位置的DCT系數大小,反映圖像不同頻率成分的強弱,位置與頻率有反應關系,水平方向從左到右,頻率逐漸升高;垂直方向從上到下,頻率逐漸升高
實驗2:DCT系數特性研究
總結:DCT系數中高頻分量對圖像影響不大
3、DWT:離散小波變換
更多:參考
小波變換分塊:
圖像轉換
PS:
彩色圖像 ——》索引圖像 :會失真
索引圖像 ——》彩色圖像:無失真
常用函數:
例子:
BW=im2bw(I,T):圖像轉換成二值圖像
參數:
I:圖像數據
T:歸一化的分割閾值(0-1)
BW:分割后的二值圖像
如何尋找閾值呢?
方法:雙峰法
適用於:圖像中前景和背景差別明顯,且各占一定比例
效果:
作業
第五次作業
問題1:
使用文件格式信息隱藏,在一幅256×256的灰度圖像中隱藏512字節秘密數據,描述隱藏實現過程,必須將哪些圖像格式參數修改,修改為什么?
解:
將秘密信息隱藏在文件數據尾部
需要修改文件頭中文件長度域,即文件頭中的 bfSize +512 即可
問題2:
在一幅3×3圖像數據中,每個像素4bit,使用MLSB算法實現14bit秘密信息的隱藏,描述隱藏方法?
解:
什么是MLSB?
除最低比特平面外,圖像其他低平面也可以隱藏信息,替換多個圖像比特平面隱藏信息的算法,叫做MLSB
問題3:
使用基於顏色索引順序的信息隱藏,如果有6個顏色值,問最多可以隱藏幾bit的秘密信息?
解:
設圖像可嵌入M比特秘密信息,有N種顏色,則要滿足下面的關系
2.使用基於調色板圖像內容的信息隱藏,針對PPT137頁的例子,其他條件不變,如果秘密信息為111000,問LSB隱藏后的像素值(顏色索引值)?

第七次作業
1、參考第4章第1個PPT第182頁,嘗試描述仙農信道容量公式的含義?如果高斯信道的帶寬為8kHz,信號和噪聲功率比為7,求該信道的信道容量?如果要在該信道上傳輸30kb/s的信號,是否能實現無差錯傳輸?
2、參考第4章第2個PPT第7頁:DCT頻域信息隱藏框架,嘗試用文字**描述基於DCT的圖像水印處理流程**?
程序:
% DCT 變換信息隱藏 io = imread("huidu.jpg"); figure; subplot(1,3,1),imshow(io),title("原圖"); io = double(io); % 待嵌入的秘密信息msg msg = [1,0,1,1]; % 用於計數,嵌入完成后停止操作。 count = length(msg); org_msg = [1,0,1,1]; T = dctmtx(8); %圖像分塊8*8 DCTrgb = blkproc(io,[8 8], 'P1*x*P2',T, T'); % 對載體圖像進行DCT變換 subplot(1,3,2),imshow(DCTrgb),title("DCT分塊變換"); [row,col]=size(DCTrgb); row=floor(row/8); col=floor(col/8); alpha=0.02; k = 1; temp=0; for i=0:(row - 1) for j=0: (col -1) irow = i * 8; jcol = j * 8; if k <= count if msg(k) == 0 %選擇(5,2),(4,3)這兩對系數, % 策略是(5,2)的DCT系數 < (4,3)時,表示嵌入了0 % 如果(5,2) > (4,3) 那我們把兩個系數交換,還表示嵌入了0 if DCTrgb(irow + 5, jcol + 2) < DCTrgb(irow + 4,jcol + 3) temp = DCTrgb(irow + 5, jcol + 2); DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow + 4,jcol + 3); DCTrgb(irow + 4, jcol + 3) = temp; end else if DCTrgb(irow + 5, jcol + 2) > DCTrgb(irow + 4,jcol + 3) temp = DCTrgb(irow + 5, jcol + 2); DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow + 4,jcol + 3); DCTrgb(irow + 4, jcol + 3) = temp; end end %將原本小的系數變的更小,使系數差變大 if DCTrgb(irow + 5, jcol + 2) < DCTrgb(irow + 4,jcol +3) DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow +5, jcol +2) - alpha; else DCTrgb(irow + 4, jcol + 3) = DCTrgb(irow + 4, jcol +3) - alpha; end k = k + 1; end end end wi=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T); %嵌入信息的載體DCT變換,恢復圖像 orgin_wi=wi/255; subplot(1,3,3),imshow(orgin_wi),title("嵌入信息后的"); % 提取消息 % ext_msg是提取出的秘密信息 ext_msg = []; T=dctmtx(8); DCTcheck=blkproc(wi,[8 8],'P1*x*P2',T,T'); %對隱秘圖像進行DCT變換 [row,col]=size(DCTcheck); row=floor(row/8); col=floor(col/8); k = 1; for i=0:(row - 1) for j=0: (col -1) irow = i * 8; jcol = j * 8; %通過比較(5,2),(4,3)這兩對系數,判斷隱藏的信息是1還是0 if k <= count if DCTcheck(irow + 5, jcol + 2) < DCTcheck(irow + 4,jcol + 3) ext_msg(k,1)=1; end if DCTcheck(irow + 5, jcol + 2) > DCTcheck(irow + 4,jcol + 3) ext_msg(k,1)=0; end k = k + 1; end end end fprintf("嵌入的信息:"); disp(msg); fprintf("提取的信息:"); disp(ext_msg);
3、參考第4章第2個PPT第56頁:DFT頻域信息隱藏框架,嘗試用文字**描述DFT圖像水印的基本流程**?

程序:
function p =watermark() %使用DCT方法,實現圖片水印嵌入 chars_info = char('shaohang110'); fprintf('原始水印信息\n %s \n', chars_info); len=uint8(chars_info); bits_info = reshape(de2bi(len,8,'left-msb')',[],1); yuanImg=imread('Lena2.bmp'); k=50000; %DFT用的系數 wmImg=[]; yuanImgYUV=[]; %彩色圖像水印嵌入 yuanImgYUV = rgb2ycbcr(yuanImg); %觀察原始圖像幅度頻率特性 %fftAM=uint8(abs(fftshift(fft2(yuanImgYUV(:,:,1))))/100); %imshow(fftAM) yuanImgYUV(:,:,1) = EmbedWM_289(yuanImgYUV(:,:,1), bits_info, k,1); wmImg = ycbcr2rgb(yuanImgYUV); %觀察嵌入水印后圖像幅度頻率特性 %fftAM=uint8(abs(fftshift(fft2(yuanImgYUV(:,:,1))))/100); %figure(2);imshow(fftAM) imwrite(wmImg,'wm.bmp'); figure; subplot(1,2,1),imshow(yuanImg),title("原圖"); subplot(1,2,2),imshow(wmImg),title("嵌入水印后"); fprintf("水印提取:"); extraWM(len); %%水印嵌入 function fw = EmbedWM_289(f, bits_info, k, type) %本程序用來對圖像進行DFT,通過改變DFT的分塊系數的能量關系,實現水印的嵌入 %f:當前需要嵌入的圖像 %bits_info:嵌入的水印內容 %k:嵌入水印的強度 %type:表示嵌入的類型, %type=1時:(e1 - e) > k,表示水印0; (e2 - e1) > k,表示水印1 %type=2時:(e1 - e2) > k,表示水印1; (e2 - e1) > k,表示水印0 stepx = 4;%每bit嵌入區域的橫向步長 stepy = 4;%每bit嵌入區域的縱向步長 %k = 50000; len_info = length(bits_info);%嵌入信息的長度 fftHuge = fftshift( fft2(f) ); if ( mod(size(fftHuge, 1), 2) == 0 ) if ( mod(size(fftHuge, 2), 2) == 0 ) fftHuge_ct = fftHuge(2:end, 2:end); else fftHuge_ct = fftHuge(2:end, :); end else if ( mod(size(fftHuge, 2), 2) == 0 ) fftHuge_ct = fftHuge(:, 2:end); else fftHuge_ct = fftHuge(:, :); end end dist_r = floor( size(fftHuge_ct, 1)/4 ); dist_c = floor( size(fftHuge_ct, 2)/4 ); fftHuge_wm = fftHuge_ct(dist_r+1: end-dist_r, dist_c+1: end-dist_c); rmax_block = floor(size(fftHuge_wm,1)/(2*stepy));%縱向(行)最大分塊數,由於中心對稱性,故只處理上半部分 cmax_block = floor(size(fftHuge_wm,2)/stepx);%橫向(列)最大分塊數 if( rmax_block * cmax_block < len_info ) disp('水印信息過長\n'); return; end SG1 = zeros(stepy*stepx/4, 2); SG2 = zeros(stepy*stepx/4, 2); % modified coefficients % 右上角的系數 count = 1; for r = 1 : stepy/2 for c = stepx/2+1 : stepx SG1(count, 1) = r; SG1(count, 2) = c; count = count + 1; end end % 左下角的系數 count = 1; for r = stepy/2+1 : stepy for c = 1 : stepx/2 SG2(count, 1) = r; SG2(count, 2) = c; count = count + 1; end end count = 1; for r = 1 : rmax_block for c = 1 : cmax_block fft_block = fftHuge_wm( (r-1)*stepy+1 : r*stepy, (c-1)*stepx+1 : c*stepx ); %---------------------------系數修改-------------------------------- % 計算能量及幅角 ext = abs(fft_block); %幅度 theta = angle(fft_block); %相角 e1 = 0; e2 = 0; for i = 1 : size(SG1,1) e1 = e1 + ext(SG1(i,1), SG1(i,2)); e2 = e2 + ext(SG2(i,1), SG2(i,2)); end % 修改能量 if(type==1) %類型1 if ( bits_info(count) == 0 && (e1 - e2) < k ) delta = (k - e1 + e2)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數 for i = 1 : size(SG1,1) ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) + delta; ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) - delta; end elseif ( bits_info(count) == 1 && (e2 - e1) < k) delta = (k - e2 + e1)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數 for i = 1 : size(SG1,1) ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) + delta; ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) - delta; end end elseif(type==2) if ( bits_info(count) == 1 && (e1 - e2) < k ) delta = (k - e1 + e2)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數 for i = 1 : size(SG1,1) ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) + delta; ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) - delta; end elseif ( bits_info(count) == 0 && (e2 - e1) < k) delta = (k - e2 + e1)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數 for i = 1 : size(SG1,1) ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) + delta; ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) - delta; end end end % 恢復FFT系數矩陣 re = ext.*cos(theta); im = ext.*sin(theta); fft_block = re + 1i*im; %------------------------------------------------------------------ fftHuge_wm( (r-1)*stepy+1 : r*stepy, (c-1)*stepx+1 : c*stepx ) = fft_block;%將修改后的FFT系數置回 fftHuge_wm( end-r*stepy+1 : end-(r-1)*stepy, end-c*stepx+1 : end-(c-1)*stepx ) = rot90( conj(fft_block), 2 );%將修改后的共軛FFT系數轉置后置回 if ( count >= len_info ) break; end count = count + 1; end if ( count >= len_info ) break; end end fftHuge_ct(dist_r+1: end-dist_r, dist_c+1: end-dist_c) = fftHuge_wm; if ( mod(size(fftHuge, 1), 2) == 0 ) if ( mod(size(fftHuge, 2), 2) == 0 ) fftHuge(2:end, 2:end) = fftHuge_ct; else fftHuge(2:end, :) = fftHuge_ct; end else if ( mod(size(fftHuge, 2), 2) == 0 ) fftHuge(:, 2:end) = fftHuge_ct; else fftHuge(:, :) = fftHuge_ct; end end fw = uint8( ifft2(ifftshift(fftHuge)) ); mse=mymse(f,fw,size(f,2),size(f,1)); psnr=10*log10(255^2/mse); fprintf('PSNR = %f\n', psnr); %%水印提取 function p =extraWM(len) %使用DCT方法,實現圖片水印提取 %提取水印時不需要原始水印內容,但是需要水印的長度 bits_info = reshape(de2bi(len,8,'left-msb')',[],1); %下面進行水印提取 wmImg=imread('wm.bmp'); %wmImg=imread('wm.jpg'); %wmImg=imread('wm2.bmp'); %彩色圖像提取水印 wmImgYUV=[]; wmImgYUV = rgb2ycbcr(wmImg); bits_info_ext = ExtractWM_289(wmImgYUV(:,:,1), length(bits_info),1); %二進制數組轉換為字符串 extrastr=''; [m n]=size(bits_info_ext); for x=1:m/8 temp=bi2de(bits_info_ext((x-1)*8+1:x*8)','left-msb'); extrastr=[extrastr char(temp)]; end extrastr ber(bits_info_ext, bits_info)
輸出:
原始水印信息 shaohang110 PSNR = 48.607484 水印提取: extrastr = 'shaohang110'
第8次課作業
1、參考第4章第3個PPT第33頁,描述針對幾何失真下采用頻域模板實現魯棒水印的方法?
解:
魯棒水印:能夠抵抗各種信號處理,攻擊
幾何失真:只要由掃描過程引起的旋轉和縮放失真
方法:提取圖像邊緣,並利用RADON投影變換來檢測圖像的傾斜角,完成后,逆向旋轉圖像即可
RADON投影變換:將原始圖像變換為它在各個角度的投影表示。
2、采用抗打印掃描水印算法(二)基於DCT分塊系數比較的方法(參考第4章第3個PPT第78頁),已知4塊內數據為:(1.2, 1.6, 1.7),(1.7,1.8,1.6),(1.8,2.0,2.1),根據該算法策略,嵌入水印0,1,0后,數據修改為什么?(D=0.5)
解:
3.采用抗打印掃描水印算法(三)基於系數分類的方法(參考第4章第3個PPT第92頁),已知4個集合分別為:
F(3,0)={ +1.0, -1.4,-0.9,-1.2},
F(2,1)={ +2.2, -1.8,+0.5,-1.0},
F(1,2)={ -1.5,+1.1,+0.3,-0.8},
F(0,3)={ +1.2, -1.3,+0.4,-1.0},
若魯棒性參數d為2,嵌入0時,要求𝑛+≥𝑛−+𝑑;嵌入1時,要求𝑛−≥𝑛++𝑑。則嵌入0,0,1,1后,系數調整為什么?
解:
第九次作業
1、半脆弱水印如何建立圖像塊中LSB與圖像塊內容的聯系?(提示:參考PPT中P. W. Wong水印算法),該算法能否抵抗圖像拼湊攻擊?如何抵抗圖像拼湊攻擊?
解:
2. 嘗試描述音頻回聲隱藏水印提取的過程?注意不要抄公式!【設原信號為x(t), 增加回聲后信號為y(t),隱藏0時,延時為Δ1,隱藏1時,延時為Δ2】
解:
3.回聲隱藏信號生成:
已知音頻片段采樣值為以下序列:
: 8, 10, 12, 14, 8, 8, 12,14,12,10,14,16, 14,18,16,12,10,12
衰減系數為0.5,’0’回聲延遲為2個采樣點,’1’回聲延遲為1個采樣點,每6個樣點為一個片段。已知秘密信息為(1,1,0)B,且隱藏后信號為:
寫出混合器信號 , (不用考慮過渡)
寫出攜帶秘密信息的信號
解:
第十次作業
1、語音信號的抽樣頻率是多少?G.711中每個抽樣值編碼位數是多少?嘗試描述參數編碼的實現思路?
解:
語音信號的抽樣頻率8k/s
G.711中每個抽樣值編碼位數是 8位
參數編碼的實現過程:先進過計算,找到當前的5個抽樣值組成的碼組和哪個碼本最接近,然后用這個碼本的編號取代原來的40bit碼組,1024個碼本對應的編碼是10bit,故經過參數后,用10bit碼本編號作為參數,進行通信。
補充:
G.711:又叫PCM(脈沖編碼調制),是國際電信聯盟訂定出來的一套語音壓縮標准,主要用於電話,它主要用脈沖編碼調制對音頻采樣,采樣率為8k每秒。它利用一個 64Kbps 未壓縮通道傳輸語音訊號。起壓縮率為1:2,即把16位數據壓縮成8位。G.711是主流的波形聲音編解碼器
G.711 標准下主要有兩種壓縮算法。一種是µ-law algorithm (又稱often u-law, ulaw, mu-law),主要運用於北美和日本;另一種是A-law algorithm,主要運用於歐洲和世界其他地區。其中,后者是特別設計用來方便計算機處理的。這兩種算法都使用一個采樣率為8kHz的輸入來創建64Kbps的數字輸出。G.711采用一種稱為分組丟失隱藏(PLC)的技術來減少丟包帶來的實際影響。有效的信號帶寬在靜默期間通過語音活動檢測(VAD)這一過程被減小。
壓縮編碼分為:波形編碼、參數編碼和混合編碼
波形編碼:對於采樣得到的每個數據進行壓縮編碼
參數編碼:提取語音信號的特征參數進行編碼,傳輸的是這些參數,不是語言信號本身
2、在靜態軟件水印中,如何設計實現中間代碼軟件水印?攻擊者如何檢測中間代碼軟件水印?
解:
實現中間代碼軟件水印分為兩部分:
首先嵌入水印:程序設計不會執行“死流程”,用合法的語句填充死流程,然后編碼源代碼,用水印替換死流程對應的中間代碼
然后提取水印:找到死流程對應位置,提取水印
攻擊者可以進行如下攻擊:
方法一:列舉出所有函數的執行時間,定位從未執行的函數
方法二:在不影響軟件功能的情況下調整指令的順序
方法三:水印不會執行指令,根據軟件執行多次執行的時間分布信息,可以很有效的猜測出水印的隱藏位置
補充:
軟件水印:把程序的版權信息和用戶身份嵌入到程序中
靜態水印:存儲在可執行程序代碼中
靜態代碼水印:靜態數據水印
靜態代碼水印嵌入位置:中間代碼、源代碼
3、采用基於大數分解難題的軟件水印方案,已知水印數字為16,基底為3,如何用基數圖表示這個水印?(按據根節點的距離,由近到遠依次編號為:2,1,0,要求說明每個節點左指針指向幾號節點)
解:
4、在像素翻轉信息隱藏中(參照PPT第86頁)已知一行6個文字,黑色像素的像素個數分別是14,17,12,14,16,17,嵌入策略定為:嵌入0,則把比值調整為0.8;嵌入1,則把比值調整為1.2;一半漢字用於嵌水印,一半用於平衡,使嵌入前后均值不變;那么嵌入1,1,0三個比特后,這行漢字的黑色像素變為(均衡像素的分配盡量平均)?
解:
參考
1、信息隱藏與數字水印.楊榆,雷敏.北京郵電大學出版社有限公司,2017年
2、信息隱藏與數字水印實驗教程.楊榆.國防工業出版社,2010年