㈠ matlab數字水印lsb方法
% read image
mat = imread('1.jpg');
mba = imread('2.bmp');
imgread = rgb2gray(mat);
mbt=imresize(mba,size(imgread));
mbt = uint8(mbt);
[maa,mab] = size(imgread);
[mba,mbb] = size(mbt);
md = ones(maa,mab);
ma = zeros(2*maa,2*mab);
ma = im2uint8(ma);
% progress the image
for i=1:1:maa
for j=1:1:mab
imgread(i,j)=imgread(i,j)-mod(imgread(i,j),4);
end
end
%========================
%enlarge image
%=======================
for j=1:1:mab
for i=1:1:maa
ma(2*i-1,2*j-1) = imgread(i,j);
ma(2*i,2*j-1) = imgread(i,j);
ma(2*i-1,2*j) = imgread(i,j);
ma(2*i,2*j) = imgread(i,j);
mb(2*i-1,2*j-1) = mbt(i,j);
mb(2*i,2*j-1) = mbt(i,j);
mb(2*i-1,2*j) = mbt(i,j);
mb(2*i,2*j) = mbt(i,j);
end
end
ma = ma+mb*3;
%ma = ma-mb*3;
%=======================
% attack
%=======================
noise = normrnd(0,0.2,2*maa,2*mab); %Gaussian, uniform,
% laplace,salt-pepper
ma = double(ma);
ma = ma+ noise;
ma = uint8(ma);
figure(1);
subplot(2,2,1);imshow(imgread);
subplot(2,2,2);imshow(mbt,[0,1]);
subplot(2,2,3);imshow(ma);
subplot(2,2,4);imshow(noise)%
%subplot(2,2,1);imshow(mb,[0,1]);subplot(2,2,2);imshow(ma);subplot(2,2,3);imshow(mc);
%=======================
% watermark extraction
%=======================
for i=1:1:maa
for j=1:1:mab
a=mod(ma(2*i-1,2*j-1),2)+mod(ma(2*i,2*j-1),2)+mod(ma(2*i-1,2*j),2)+mod(ma(2*i,2*j),2);
a=(-a+mod(ma(2*i-1,2*j-1),4)+mod(ma(2*i,2*j-1),4)+mod(ma(2*i-1,2*j),4)+mod(ma(2*i,2*j),4))/2;
if a<4
md(i,j)=0;
else
md(i,j)=1;
end
end
end
md = uint8(md);
figure(2);imshow(md,[0,1]);
㈡ 關於Matlab數字水印
隨著數字技術和計算機網路技術的迅速發展,數字化信息的傳播和獲取變得空前快捷和方便,促進了多媒體信息交流的發展。但是由於數字媒體易於存儲、復制和傳播的特點,使大量數字媒體在以合法形式進行傳播的同時,經常遭遇非法復制與傳播。而一些傳統加密技術在數據傳輸中又不能有效地防止偽造及侵權行為 在這種形勢下,作為傳統加密技術的有效補充,數字水印技術(Digital Watermarking)應運而生。
在數字媒體應用日益廣泛的同時,在相當長的一段時間,大部分的圖文信息還將以印刷方式存在和傳播。但是日益猖獗的假冒偽劣行為卻給印刷品的防偽帶來了新的挑戰 在這種情況下 將具有高技術含量且製作成本低的數字水印技術用於印刷品的防偽是目前一個新的課題和方向。
數字水印是一種新的數字媒體保護技術,它是將特定的信息(如版權信息、序列號、公司標志、有意義的文本等)嵌入到圖像、語音、視頻等各種數字媒體中,以達到版權保護等目的。同時,這種信息的嵌入不影響主媒體的使用價值,不容易被人的知覺系統覺察且通過特定的恢復方法,可提取出來原來嵌入的信息。通過提取這些隱藏的信息 可以確認內容的創建者和購買者,檢測其真實性、完整性。常見的在圖像中嵌入數字水印可以視為在強背景(即原始圖像)下疊加一個視覺上看不到的弱信號(水印)。由於人的視覺系統(Human Visual System,HVS)解析度受到一定的限制 只要疊加信號的幅度低於HVS的對比度門限,HVS就無法感覺到信號的存在。因此 在HVS的對比度門限范圍內,對原始圖像做一定的改動(加入水印),就可達到在不改變視覺效果的情況下嵌入一些隱藏的信息。一般對數字水印有幾個基本要求:①不可感知性;②可證明性:③魯棒性:④安全性。
通用的數字水印模型包含兩個階段:水印的嵌入和水印的提取或檢測。嵌入階段的設計主要解決兩個問題:①數字水印的生成。可以是一串偽隨機數、數字標識、文本以及圖像等,也可以是與作者有關的字元串、圖標等信息經過加密產生:②嵌入演算法。嵌入方案的目標是使數字水印在不可感知性和魯棒性之間找到一個較好的折中。
檢測階段主要是設計一個相應於嵌入過程的檢測演算法。檢測的結果是原水印(如字元串或圖標等)或是基於統計原理的檢驗結果以判斷水印存在與否,檢測方案的目標是使錯判與漏判的概率盡量小。為了增加去除水印的不可預測的難度, 目前大多數水印製作方案都在加入、提取時採用了密鑰 只有掌握密鑰的人才能讀出水印。
數字水印技術有多種方法,根據數字水印載入方法的不同,可將數字水印分為空間域數字水印和變換域數字水印兩大類。根據檢測水印是否需要原始圖像 可將數字水印技術分為私有水印技術、半私有水印技術和公開水印技術三類。
1.特殊要求
由於在印刷中必須對連續調圖像進行加網以得到離散的半色調圖像 用改變印版上單位面積內著墨量多少即網點數目來表示連續調圖像的層次和顏色的變化 所以將數字水印技術應用於印刷品的防偽就必須考慮印刷中加網這一環節,即用於印刷品防偽的數字水印技術是基於半色調技術之上的。
除此之外,與在數字媒體中的應用相比,應用於印刷品防偽的數字水印除了以上提到的幾個基本要求外,還要滿足一些特殊的要求:
①視覺不可見性和機讀性。表現在採用列印或印刷設備時,在各種解析度下加入的水印,不能因解析度的高低而使水印顯現,同時它不影響原有印刷品的質量 只有通過特定的檢測設備和計算機軟體才可識別。
②抵抗色彩變換、文件格式變換在A/D和D/A轉化過程中,數字水印演算法需抵抗伽瑪矯正和色彩失真 另外,圖像在流通過程中,由於印刷品的老化也會產生色彩失真。同時也要能抵抗經常遇到圖像文件格式(如BMP、TIFF、JPEG等)之間轉換及常見的操作(旋轉、剪切, 縮放等)。
③對印刷設備沒有特殊要求.不改變印刷工藝流程.不增加印刷成本。
2.原理及演算法
用於印刷品防偽的數字水印技術的原理與用於多媒體的數字水印技術的原理大致相同.只不過在水印的嵌入過程要考慮到加網.在水印的提取及檢測過程要對印刷品圖文信息進行掃描.在這個過程有一個模/數(A/D)轉換過程。這就要求基於半色調的數字水印技術的演算法在相應的嵌入和檢測過程中必須考慮這些因素。其嵌入和檢測過程如圖1、2所示。
縱觀以往數字水印在印刷品防偽方面的研究工作.可查閱資料並不多。現有的基於半色調圖像的數字水印技術大致有以下幾種:
①基於半色調圖像的數字水印技術是將不可見的數字信息嵌入到一幅半色調圖像中.通過掃描該半色調圖像並實施一定的提取演算法來獲得嵌入的水印信息。其中的一種技術是使用兩個不同的抖動矩陣來產生順序抖動半色調圖像.由於這兩個不同的抖動矩陣所具有的不同統計特性.因此可以檢測到水印是否存在。
②第二種技術是利用向量量化將水印嵌入到誤差擴散半色調圖像的最低有效位(LSB)上。
③第三種技術是在順序抖動或誤差擴散圖像中.把水印數據隱藏在隨機的位置.通過自套牢或成對套牢技術來改變這些隨機位置的像素值來實現信息的隱藏(效果圖如圖3所示)。
④第四種技術是將水印數據隱藏在誤差擴散圖像里,使用誤差擴散的方法來減輕因隱藏數據而帶來的圖像失真,以使圖像獲得良好的視覺效果。在上述方法中.盡管被隱藏的數據本身也是圖像,但這些演算法並沒有提供直接在半色調圖像上觀察這些被隱藏的圖像的方法。
⑤ 另一類技術是將被隱藏的可視圖像嵌入兩幅或多幅半色調圖像中.當把這兩幅圖像進行疊合時.被隱藏的圖像就可直接顯現出來。其中的一種技術是運用隨機網屏或共軛網屏來將被隱藏的信息嵌入到半色調圖像中。因為共軛所具有的性質.當兩幅半色調圖像被疊合在一起時.被隱藏的信息將會呈現出來(其效果圖如圖4所示)。
⑥ 另一種技術是考慮雜訊平衡誤差擴散和交替使用不同的誤差擴散核擴散的半色調數字水印技術。
⑦還有人使用一種基於半色調技術的人眼視覺系統模型.提出了直接二進制位搜索(Di rect Bina rySearch. DBS)的方法。DBS用於半色調圖像的設計.以實現最優化的視覺效果質量與水印的檢測。
3.結果討論
我們用Matlab 6.5編程模擬實現了256級灰度圖像lena (圖3一a)的誤差擴散加網(使用的是Jarvis—Nike誤差擴散核)得到半色調圖像(圖3 一b),並使用不同的數字水印嵌入演算法分別得到了含有水印信息的半色調圖像:如圖3一c和圖4一b。
圖3一c中使用的水印嵌入技術是把水印數據隱藏在誤差擴散圖像中隨機的位置(位置由密鑰決定).通過自套牢來改變這些隨機位置的像素值來實現信息的隱藏。所得到的含有水印的半色調圖像與原Iena半色調圖像圖3一b相比較.可以看到相當於在原圖中加入一些雜訊.當嵌入的水印信息不大.在HVS的對比度限定范圍內時.是不會改變其視覺效果的。圖4一b中使用的水印嵌入技術則是根據原半色調圖像和水印圖像的特徵將水印信息嵌入到原半色調圖像得到含有水印信息的半色調圖像(圖4一b).當將所得的圖像與原來的半色調圖像疊加時.就可以再現水印圖像。
在實驗條件下.將所得到的圖像列印、掃描、預處理後根據對應的水印提取演算法.可以分別提取出對應的水印圖像。在實驗中.水印除了使用圖中的二值圖片外.我們還使用了文本、武漢大學校徽等都得到了滿意的結果。
美國Digimarc公司率先在1995年推出的媒體橋(mediab rldge)技術就以插件形式集成到Phot0 Sh0P和Corel Draw圖像處理軟體中。隨後,又推出了開拓訪問Inte rnet的一條新途徑—— 通過在雜志廣告、產品包裝、目錄甚至各類票據中隱藏不可見的數字水印。用戶將這些傳統媒體放在網路攝像機(web came ra)前,就可以直接將用戶帶到與印刷圖像內容相關聯的網路站點,並在計算機上顯示出產品的相關信息。英國Signum公司推出的VerlData系列軟體,用不可見的水印阻止商標的盜版以及重要文檔的偽造、盜版和未授權的更改。瑞士AlpVision公司專為列印文檔設計的SafePape r軟體則可嵌在MicrosoftWord軟體中。它將水印信息(如商標 專利 名字 金額等)隱藏到列印紙內.以此來證明該文檔的真偽。日本的I BM東京研究實驗室提出了用數據隱藏作為解決方案來鑒定數字化照片的來源.證實數字化照片的完整性.判斷照片是否被篡改以及定位篡改的地方。
我國的有關部門研究人員正在加緊數字水印印刷防偽技術的研究工作.大連理工大學研究的數字水印防偽印刷技術可以實現在印刷圖像中加入數字水印.並且可以通過掃描儀和專用軟體完成印刷圖像中數字水印的自動檢測。上海阿須數碼技術有限公司也推出了有自主知識產權的圖像數字水印軟體A S S u reImageMa rk 2.0:成都宇飛信息工程有限責任公司研究的印刷列印數字水印技術已得到商業化應用.並於2004年4月1日獲得」國家科技型中小型企業創新基金」的資助。標志著我國數字水印技術的研究已經進入實質性階段,其研發與應用水平與國際先進水平的差距逐步縮小。
最為一種較新的技術—— 數字水印在印刷領域中的應用是一個新的方向.我們相信.數字水印技術將在防偽印刷領域發揮越來越大的作用.並會帶來可觀的經濟效益和社會效益。但是我們應同時看到目前市場上用於印刷品防偽的數字水印產品在技術上還不成熟.仍有大量的研究工作要做。
㈢ 基於Arnold置亂的數字水印圖像加密演算法的設計,基於Matlab語言編程,完成Arnold置亂演算法,並用Matlab GUI工
clc
clear all;
iTimes=10; %置亂次數
% 讀入水印圖像
file_name='3232水印.bmp';
message=double(imread(file_name));
%水印圖像矩陣的行數與列數
Mm=size(message,1);
Nm=size(message,2);
%對水印圖像進行arnold置亂
if Mm~=Nm
error('水印矩陣必須為方陣');
end
if Mm~=90
error('必須為90*90大小,或者修改置亂次數');
end
tempImg=message; %圖像矩陣賦給tempImg
for n=1:iTimes %置亂次數
for u=1:Mm
for v=1:Nm
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),Mm)+1; %新像素行位置
ay=mod((u-1)+2*(v-1),Nm)+1; %新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
% 顯示水印,嵌入水印圖像與原始圖像
figure(1)
subplot(1,3,1);
imshow(message,[]);
title('原始水印');
subplot(1,3,2)
imshow(outImg,[]);
title('置亂水印');
% arnold反置亂
message_arnold=tempImg;
iTimes1=60-iTimes
%置亂後水印圖像矩陣的行數與列數
Mo=size(outImg,1);
No=size(outImg,2);
for n=1:iTimes1 % 次數
for u=1:Mo
for v=1:No
temp1=tempImg(u,v);
bx=mod((u-1)+(v-1),Mo)+1;
by=mod((u-1)+2*(v-1),No)+1;
outImg1(bx,by)=temp1;
end
end
tempImg=outImg1;
end
message=outImg1;
% 顯示反置亂後水印
%figure(3)
%subplot(1,3,1);
%imshow(message_arnold,[]);
%title('提取的置亂水印');
subplot(1,3,3);
imshow(message,[]);
title('反置亂(恢復)水印');
%subplot(1,3,3);
%imshow(orig_watermark,[])
%title('原始水印')
gui 自己學學吧 matlab中文論壇 gui板塊
㈣ 如何利用matlab軟體實現水印添加和提取
3 視頻水印的嵌入和檢測方案
3.1水印的預處理
採用二值圖像作為待嵌入的水印數據,本文針對的研究對象因為是二維圖像故採用的是二維Arnold變換。
二維Arnold變換定義為:
(3-1)
其中,(x,y)是原圖像的像素點,(x』,y』)是變換後新圖像的像素點,N是圖像階數,即圖像的尺寸大小,一般多為正方形圖像。由於Arnold變換具有周期性,因此可利用其周期性Period來對圖像進行反變換。即在水印嵌入過程中可將水印置亂次數作為密鑰times,再進行水印嵌入,當水印提取出來時,再將其繼續: (Period-times)次即可使其恢復至原圖。這就是利用Arnold的正變換來進行的置亂恢復方案。Arnold變換次數由版權所有者保管。
對水印進行置亂有以下優點:
(1) 採用置亂技術的合法者可以自由控制演算法的選擇,參數的選擇以及使用隨機數技術,從而使非法使用者難以破譯圖像內容,可以提高水印信息的安全性;
(2) 置亂技術可以分散錯誤比特的分布,提高數字水印的視覺效果,從而增強其魯棒性。
3.2 視頻水印的嵌入
水印嵌入演算法關鍵在於以下三點:
(1) 水印的結構;
(2) 水印的嵌入區域;
(3) 嵌入技巧;
本文選取二值圖像作為水印。為了提高水印的魯棒性,大多數的DCT域水印演算法把水印信號嵌入到DCT系數的低頻部分。但低頻區域是圖像的能量集中部分,嵌入到低頻會降低透明性。而嵌入在高頻雖然透明性比較好,但對大多數的圖像處理對高頻成分影響較大,從而降低水印的魯棒性.於是大多數的水印演算法將水印信號嵌入在載體圖像DCT系數的中頻部分,以達到透明性和魯棒性的最佳折衷。各種嵌入技巧的最終目的還是為了盡量地提高水印的魯棒性和透明性。
用於版權保護的數字水印在盡量提高魯棒性的同時還要滿足人類的視覺極限,因此必須根據HVS找到嵌入位置。
本文將HVS歸納為運動敏感性、紋理敏感性和亮度敏感性。在接下來的嵌入過程中,充分利用了這些特性。如圖3-1中間分支所示。
嵌入過程如圖3-1所示。
圖3-1 水印嵌入過程
從視頻中讀取亮度分量Y,因為它是最有效的數據,根據NEC演算法,嵌入到它裡面的水印才具有最強的魯棒性。根據式(3-2)所示的運動敏感性閾值計算公式,尋找32幀滿足敏感性比較大的視頻幀Yi (i=1,2,…32)。
(3-2)
其中 (t代表當前幀的編號)
接下來,將Y32中的數據按照64*64的尺寸切分成20塊BYij (j=1,2,…20),於是我們可得到20塊尺寸為64*64*32的三維數據塊BYk (k=1,2,…20),如圖2-3所示。
圖3-2 亮度分量的分塊
根據式(3-3)、式(3-4)所示的亮度敏感性Lk和紋理敏感性Dk計算公式,通過計算,我們選擇計算值都比較高的20塊數據中的一塊 ( )作為水印的嵌入塊。
(3-3)
(3-4)
其中, 是BYk中的亮度數據, 。
最後,折衷考慮復雜度和性能,我們對選定的一塊數據塊 實施了2階三維DCT變換。根據NEC演算法的思想,且為了抵抗濾波和壓縮攻擊,我們將置亂後的水印序列嵌入到了第一幀DCT系數c(u,v)中,詳見式(3-5)。
(3-5)
其中,w(u,v)是水印序列中的數據,c(u,v)是DCT變換後第一幀中的系數,c』(u,v)是嵌入水印後的系數,S是非負整數(且滿足T1=S/4, T2=3*T1)。
嵌入完成後,對c』(u,v)實施反2階三維DCT變換就得到了嵌入水印後的視頻數據,再將它們放回原來的位置即可。
需要說明的是,在整個嵌入過程中,所有用到的參數都應作為密鑰保留。
具體方案如下所述:
第一步:抽取32幀視頻Y分量數據:
(1) 讀取視頻文件;
(2) 提取所有的Y分量,把所有的Y分量分為32組;
(3) 每組4幀,從各組中選出一個最運動敏感的,判斷每組中最大的Y_deltmax,存入變數m;
(4) 定位最大的Y_deltmax,存入變數w;
Y32是就是所需的視頻幀中Y分量滿足敏感性的32幀視頻 (355*288*32)。
第二步:分塊過程:
(1) 對行分塊(4塊);
(2) 對列分塊(5塊);
(3) 隔十幀取一幀,共從32幀中取4幀以降低運算量;
(4) 一個數一個數的賦值;
切成20塊,每塊為64*64*4的數據塊BY,維數不同,只能逐個象素賦值。
第三步:根據公式計算數據塊BY的亮度敏感性L和紋理敏感性D
第四步:選取L和D都比較大的一塊嵌入水印
(1) 判斷最大的L,存入變數Lm;
(2) 去掉這個最大的塊再比較;
(4) 賦第一塊的L的權重為20;
(5) 計算第2塊到第20塊的L的權重;
(6) 同理對D進行處理;
(7) 計算每塊BY的權重;
(8) 對所有的20塊BY的權重qz按由小到大的順序進行排序,並保持原來的位置索引index,則index[20]就是所要選取的塊;
第五步:三維DCT變換
由於視頻是由圖像數據流組成的,所以可以把視頻的每一幀看作是一幅靜止的圖像。對運動圖像序列進行3D-DCT,可以視為先對視頻的每一幀進行2D-DCT,再對幀間方向進行1D-DCT。
第六步:嵌入水印數據
將置亂的水印序列嵌入所選的DCT系數中,即嵌入經過3D-DCT變換後的數據塊中的第一幀數據中。然後把這些數據進行反3D-DCT變換後放回原位置。
第七步:將所選的數據放回原位置
最後一步:寫視頻文件
3.3視頻水印的檢測
水印提取是嵌入的逆過程,本演算法的一大優勢是,水印提取時無需原始視頻數據的參與,但依然需要一些參數。它們是:
(1) 嵌入過程第四步產生的塊BY的排序結果,由此我們可以得知水印的大致嵌入位置;
(2) 嵌入時指定的參數S;
(3) 需要Arnold變換的次數和周期;
獲得了上面的各項參數,水印的提取就十分簡單,具體過程如圖3-3所示。
圖3-3 水印盲提取過程
方案如下:
從待提取水印的視頻數據 (可能是被攻擊過後的視頻)中抽取出亮度分量Y』,根據密鑰,抽出32幀中的四幀亮度分量 ,然後分別從這組數據中提取水印。
在圖3-3中,首先將 分隔成20塊 ,並找到和 對應的 。然後,對 做二階三維DCT變換,根據式(3-6)提取出水印數據 。
(3-6)
其中, 是DCT系數。
最後,我們將 進行Arnold變換,得到水印圖像,作為最終提取出的水印。
具體步驟如下所述:
第一步:抽取32幀視頻Y分量數據:
(1) 讀取嵌入水印圖像的視頻文件;
(2) 提取所有的Y分量,把所有的Y分量分為32組;
(3) 每組4幀,從各組中選出一個最運動敏感的,判斷每組中最大的Y_deltmax,存入變數m;
(4) 定位最大的Y_deltmax,存入變數w;
Y32是就是所需的視頻幀中Y分量滿足運動敏感性的32幀視頻,Y32是一個355*288*32的三維數組。
第二步:分塊過程:
(1) 對行分塊(4塊);
(2) 對列分塊(5塊);
(3) 隔十幀取一幀,從32幀中共取4幀以降低運算量;
(4) 一個數一個數的賦值;
切成20塊,每塊為64*64*4的數據塊BY,維數不同,只能逐個象素賦值。
經過計算其亮度敏感性和紋理敏感性並排序,index[20]就是本文演算法中嵌入水印的塊;
第三步:三維DCT變換
第四步:Arnold變換
由於本演算法中水印圖像是二值圖像,其Arnold變換是二維變換,周期是Period,嵌入水印時變換了times次,所以此處只需變換(Period-times)次就可得到結果。
第五步:寫圖像文件
提取水印圖像數據並寫成圖像文件
第六步:檢測水印圖像存在與否,並與原水印圖像比較。
最後一步:進行實驗,驗證本文演算法的可見性和魯棒性。
經過以上步驟就是水印圖像信息嵌入視頻中的方法,具體實現過程見第四章。
4 用MATLAB實現視頻水印的嵌入和檢測
Matlab是近年來在國內外廣泛流行的一種可視化科學計算軟體。它的特點是結構簡單、數值計算高效、圖形功能完備、圖像處理方便,是國際公認的最優秀的科學計算與數學應用軟體之一。利用Matlab實現數字水印圖像演算法便捷、高效,省去了繁瑣的程序代碼,避免了科研人員在編程上浪費精力。
其內容已涉及矩陣代數、微積分、應用數學、信號與系統、神經網路、小波分析及應用、數字圖像處理、計算機圖形學、自動控制與通信技術等諸多方面,是科學計算、系統模擬、信號與圖像處理的主流軟體,受到了各方科研人員的青睞,在數字水印技術中得到了廣泛的應用。將Matlab應用於數字水印技術,其優點主要有以下幾個方面:
(1) 強大的數值計算功能
視頻水印技術是針對圖像進行研究的,而圖像是由矩陣表達的,將水印嵌入視頻中及從視頻中將水印提取出來都意味著大量的矩陣運算,而矩陣運算更是Matlab語言的核心,表達自然、直接。因此,利用Matlab強大的矩陣運算功能來實現圖像水印技術非常合適。
(2) 方便的圖像讀取和顯示功能
視頻水印首先要將數據從視頻中讀取出來,嵌入水印後還要將嵌入水印後的數據還原為視頻。Matlab為用戶提供了專門的圖像處理函數,用於讀寫顯示圖像數據。這種方法不像其他編程語言那樣,需要編寫復雜的代碼,只需要簡單地調用Matlab提供的函數即可,相關的函數及其功能主要有下列一些:
imread 將圖像讀入工作空間;
imwrite 將圖像寫入磁碟;
image 提供最原始的圖像顯示函數;
imshow 是最常用的顯示各種圖像的函數;
load將文件讀入工作空間;
(3) 高效的圖像變換功能
數字水印嵌入演算法一般分空域方法和頻域方法。空域方法指通過改變象素的亮度值來加入數字水印:頻域方法指圖像通過某種變換後再嵌入數字水印。與空域法相比,頻域法具有如下優點:在變換域中嵌入的水印信號可以分布到空域的所有象素上,有利於保證水印的不可見性。在變換域中,視覺系統的某些特性(如視頻特性)可以更方便地結合到水印編碼過程中。變換域的方法可以與國際數據壓縮標准兼容,從而實現壓縮域內的水印編碼。因此,變換域的方法應是水印演算法未來趨勢的主流。但是變換域的演算法一般來講計算量都比較大,需要復雜的編程運算,Matlab則改變了這種現狀。在Matlab圖像處理工具箱中,提供了常用的圖像變換函數,復雜的變換域演算法在Matlab中只需簡單地調用函數即可實現,充分體現了使用Matlab的簡便性和高效性。
主要圖像變換函數如下:
dct是一維離散餘弦變換;
idct是一維離散餘弦逆變換;
dct2是二維離散餘弦變換;
idct2是二維離散餘弦逆變換;
(4) 豐富的圖像處理函數
水印技術要求嵌入的水印不可見且有較強的魯棒性。不可見性可通過視覺效果和計算圖像的峰值信噪比來比較優劣,而魯棒性則要對水印後圖像進行各種攻擊,通過比較攻擊後圖像提取出的水印情況來說明問題。Matlab有各種圖像處理函數,可實現對圖像的各種攻擊。
綜上所述,Matlab具有語言簡潔、函數豐富、使用方便、數值計算高效等特點,將功能強大的Matlab軟體應用於數字水印技術是有效的選擇,因此,本文採用Matlab對圖像水印進行研究。
4.1水印的嵌入過程
(1) 基於Arnold變換的圖像置亂
Matlab實現如下:
Arnold變換由function r=Arnold(w0,row,colum,times) 實現,其中w0為讀取的圖像數據,row是行數,colum是列數,times是Arnold變換次數。
function r=Arnold(w0,row,colum,times)
for k=1:times
for i=1:row
for j=1:colum
i1=i+j;
j1=i+2*j;
if i1>row
i1=mod(i1,row);
end
if j1>colum
j1=mod(j1,colum);
end
if i1= =0
i1=row;
end
if j1= =0
j1=colum;
end
w1(i1,j1)=w0(i,j);
end
end
w0=w1;
end
r=w0;
用imwrite(w0,'Arnold.bmp', 'bmp')寫置亂後的圖像文件;在MATLAB中用imshow('Arnold.bmp')顯示此圖像。
本文採用二維的二值水印圖像watermark.bmp,我們將圖像數據(64*64)掃描到二維的矩陣中並實施Arnold變換,從而得到置亂後的二維矩陣。隨著迭代次數的增加,圖像逐漸趨於混亂,不過到一定次數時,又將回到原圖。因為watermark.bmp大小為64*64,故經過試驗圖像迭代48次後將回到原圖,即周期性Period=48。
本演算法選擇置亂8次,因為8次Arnold變換後原水印圖像已經成為無形狀的圖像。實驗結果表明,該方法能較好地刻劃圖像的置亂程度,與人的視覺基本相符。但需要指出的是不一定圖像的置亂次數越多其置亂度就越高。所以,在水印嵌入時,為了提高其魯棒性而增加置亂次數的方法是不科學的,合理的做法是計算置亂後圖像的置亂度,達到較為滿意的置亂度後就可停止置亂,避免盲目的提高置亂次數。
置亂次數作為密鑰有視頻版權所有者保管,如果非法所有者不知道置亂次數就很難恢復出原水印圖像。
原水印圖像如圖4-1所示,本演算法實現置亂8次後效果如圖4-2所示:
圖4-1 水印原圖像 圖4-2 置亂8次後
(2)Matlab實現嵌入過程:
本文中選取352×288×142的yuv格式視頻流進行測試。YUV顏色模型是一種常用的顏色模型,其基本特徵是將亮度信號與顏色信號分離,由於人眼對亮度的變化比對顏色的變化敏感,因此,YUV模型中Y分量的值所佔帶寬大於等於彩色分量所佔帶寬。YUV色彩空間模型可以在一定程度上避免RGB模型的高分散性和高相關性所帶來的閉值劃分問題,計算也較為簡單。這種色彩空間模型中Y和UV分量是相互獨立的,反映了人眼觀察彩色的視覺規律,在實際中應用較多。其中「Y」表示明亮度(Luminance或Luma),也就是灰階值;而「U」和「V」表示的則是色度(Chrominan「或Chroma),作用是描述影像色彩及飽和度,用於指定像素顏色。因此選擇YUV顏色空間更加穩定,易於分析。
本文選擇測試視頻中的第39幀如圖4-3所示。YUV格式的視頻中Y:U:V=4:2:2,但通俗叫「420」格式。
圖4-3 未嵌入水印的視頻
第一步:讀取文件;
讀取視頻文件由[yuv,Y,u,v,num_f]=loadyuv(filename)實現,filename是所選取得視頻文件名稱。yuv是一個四維數組,它返回的是視頻的yuv分量,Y是亮度分量,u和v是色彩分量,num_f是視頻文件中所有幀的數目。
讀取一幀數據的YUV分量在Matlab中由以下源代碼實現:
function [YUV,Y,U,V] = loadFileYUV(width,heigth,Frame,fileName,format)
[Teil_h,Teil_b]=YUVFormat(format);
fileId = fopen(fileName,'r');
其中width:每一幀的寬度;heigth:每一幀的高度;Frame:當前load的那一幀;filename:視頻文件名;Teil_h:垂直比例參數;Teil_b:水平比例參數;YUV:返回值,返回YUV分量,是一個三維變數,本文演算法中將U、V分量的寬度和高度設成與Y一樣的了,因此U、V分量中有重復的。YUV(:,:,1)存放Y分量;YUV(:,:,2)存放U分量;YUV(:,:,3)存放V分量;Y,U,V是三個分量的實際值,二維矩陣,沒有重復,他們的長度可能不一樣。
Y_delt(j)=delt(Y(:,:,w(i)),Y(:,:,4*(i-1)+j));
其中Y_delt是當前幀與下一組各幀的Y的差,m(i)=max(Y_delt(j));判斷每組中最大的Y_deltmax,存入變數m,以此來得到每組中最運動敏感的視頻幀。w(i+1)=4*(i-1)+k定位最大的Y_deltmax,存入變數w。
最後得到Y32=double(Y(:,:,w)), Y32是視頻幀中Y分量滿足敏感性的32幀視頻是一個355*288*32的三維數組。
第二步:分塊;
分塊時因為需要塊標號,由此造成維數不同,所以只能逐個象素賦值,在Matlab中由BY(t1,t2,t3,j*5+k+1)= double(Y32((64*j+t1),(64*k+t2),i))實現,切成20塊,每塊為64*64*4的數據塊BY ,其中t1是塊的杭坐標,t2是塊的列坐標,t3幀標號,j*5+k+1是快標號。
第三步:三維DCT變換;
運動圖像序列的每一幀可以看作是靜止圖像 對運動圖像序列進行3D DCT,可以視為先對每幀進行2D DCT,再對幀間方向進行1D DCT。
%對每一塊的幀間方向進行1D DCT變換
for i=1:64
for j=1:64
dcta(i,j,1:4,index(20))=dct(BY(i,j,1:4,index(20)));
end
end
%對每一塊的每一幀進行2D DCT
for i=1:4
dct3a(:,:,i,index(20))=dct2(dcta(:,:,i,index(20)));
end
第四步:嵌入水印過程;
讀入二值水印圖像由message=double(imread('watermark.bmp'))實現 ,message是一個由0和1組成的二維數組。
將置亂的水印序列嵌入所選的dct系數中,源代碼如下所示:
其中dct3a是DCT系數,index[20]是紋理敏感性和亮度敏感性都比較好的一塊,S作為密鑰由版權所有者保管。
S=60;
T1=S/4;
T2=3*T1;
for i=1:64
for j=1:64
if (w2(i,j)==1)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T1;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T1;
end
end
if (w2(i,j,:)==0)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T2;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T2;
end
end
end
end
第五步:三維DCT反變換;
先對塊的第一幀進行二維DCT反變換,然後在對其它三幀進行二維反變換,最後對幀間方向進行一維DCT反變換。此過程由Matlab實現如下:
二維DCT反變換:
idcta(:,:,1,index(20))=idct2(dipin);
for i=2:4
idcta(:,:,i,index(20))=idct2(dct3a(:,:,i,index(20)));
end
對每一塊的幀間方向進行一維DCT反變換
for i=1:64
for j=1:64
idct3a(i,j,1:4,index(20))=idct(idcta(i,j,1:4,index(20)));
end
end
第六步:把這些數據放入原位置;
第七步:寫視頻文件;
寫視頻文件由以下程序實現,其中fileId為寫入視頻文件的位置。
fileId = fopen('vectra_w.yuv','wb')
fwrite(fileId,Y(:,:,i)' , 'uchar');
fwrite(fileId,u(:,:,i)' , 'uchar');
fwrite(fileId,v(:,:,i)' , 'uchar');
效果如圖4-4所示:
圖4-4 嵌入水印的視頻
4.2水印的檢測過程
水印的檢測過程就是嵌入水印的逆過程,其Matlab實現如下所示:
filename='vectra_w.yuv';此文件是對含有水印的視頻(可能是被攻擊過後的視頻)文件。
[yuv,Y,u,v,num_f]=loadyuv(filename);
讀取視頻文件和三維DCT正變換其原理和嵌入過程相同,此處不再贅述。
提取水印數據在Matlab中由以下程序實現,其中S、T1、T2等都是嵌入時的密鑰,版權所有者擁有它。
for i=1:64
for j=1:64
if (mod(abs(dct3b(i,j,1,index(20))),S)<((T1+T2)/2))
shuiyin(i,j)=1;
end
if (mod(abs(dct3b(i,j,1,index(20))),S)>=((T1+T2)/2))
shuiyin(i,j)=0;
end
end
end
Arnold反變換如下所示:
w0=shuiyin;
w2=Arnold(w0,Hm,Wm,40);
w0是檢測到的水印數據,Hm和Wm是水印數據的行和列,變換次數為40。
寫水印文件,檢測水印圖像存在與否,並且和原水印圖像有無差異。
imwrite(w2,'恢復.bmp', 'bmp');
imshow('恢復.bmp');
綜上,水印的嵌入主要經過將視頻和水印分別進行預處理,然後根據嵌入演算法選擇水印的合適嵌入位置以及合理嵌入策略,從而得到含水印的視頻數據。在各個環節中採用HVS特性來提高視頻水印的魯棒性.最後用相應的視頻水印檢測策略提取出水印從而實現視頻的保護。結果顯示本文演算法能成功提取出水印圖像。
㈤ 一種基於DWT的非自適應數字水印演算法及其MATLAB實現
你這個很簡單啊,提取時有原始圖像,在圖片在網上搜索《lena圖像》應該能搜到。
至於水印圖,自己可以用畫圖工具,做一個32x32的,在matlab上處理一下做成2值圖。
至於代碼部分,開始段,[cA1,cH1,cV1,cD1]=dwt2(x,'db1') % x 是原圖處理過的灰度圖。
這就沒什麼了啊。已經都告訴你了。
流程是這樣的。
嵌入過程:
讀取原圖。
對原圖做灰度處理。
讀取水印。
對水印圖做2值處理。
對灰度圖做3次DWT。
設置嵌入強度。
根據嵌入演算法將水印嵌入到需要的部分。
將嵌入後的部分,替換原來的部分後做IDWT。
提取過程:
讀取原圖,做3次DWT。
讀取嵌入水印的圖片,做3次DWT。
取出原來嵌入的部分,和原圖為嵌入的部分根據演算法提取水印。
大體是這樣,奉勸你一句,不要抄他的,這個演算法很小白,抄也要抄有前途的啊。這個很白痴啊。嵌入水印在[cA3,cH3,cV3,cD3]中,哪有嵌入到cD3中的?白痴啊。一般選擇嵌入也是選中間的cH3或cV3或這兩個都選。還有,提取時還需要原圖片,很無語了,需要原圖片還需要做什麼別的演算法嗎?簡單的加減乘除就搞定了。裡面還添加了for運算,matlab里for的運算速度是最慢了。
㈥ 應用MATLAB編程實現數字水印
最後一句 subplot(2,2,3);imshow(D,[]);title('嵌入水印的圖像');
改成 subplot(2,2,4)...暈,你真馬虎
另外我復制到我的matlab裡面運行的時候發現必須輸入灰度圖像才能通過prewitt邊緣檢測,建議在前面加上灰度化
clear;clc;close all
size=256;block=8;blockno=size/block;LENGTH=size*size/64;
Alpha1=0.02; Alpha2=0.1; T1=3; I=zeros(size,size); D=zeros(size,size); BW=zeros(size,size); block_dct1=zeros(block,block);
%產生高斯水印,並顯示水印信息;
randn('seed',10);mark=randn(1,LENGTH);
subplot(2,2,1);plot(mark);title('水印:Gaussian noise');
%顯示原圖
subplot(2,2,2);I=imread('1.jpg');
I=rgb2gray(I);
imshow(I);title('原始圖像:I');
%顯示prewitt為運算元的邊緣圖
BW=edge(I,'prewitt');subplot(2,2,3);imshow(BW);
title('edge of origine image');
%嵌入水印
k=1;
for m=1:blockno
for n=1:blockno
x=(m-1)*block+1; y=(n-1)*block+1;
block_dct1=I(x:x+block-1,y:y+block-1);
block_dct1=dct2(block_dct1);
BW_8_8=BW(x:x+block-1,y:y+block-1);
if m<=1|n<=1
T=0;
else
T=sum(BW_8_8); T=sum(T);
end
if T>T1
Alpha=Alpha2
else
Alpha=Alpha1;
end
block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k)); block_dct1=idct2(block_dct1);
D(x:x+block-1,y:y+block-1)=block_dct1;
k=k+1;
end
end
%顯示嵌入水印後的圖像
subplot(2,2,4);imshow(D,[]);title('嵌入水印的圖像');
㈦ 用matlab做數字水印嵌入和提取,結果提取出來的水印與原水印完全不同,難道水印圖像和原圖像有一定的要求
clc
[a type]=myfunction(0.7,0);/a嵌入強度,type攻擊類型
x=imread('E:ori1.bmp');
subplot(2,3,1);
image(x);
title('初始待加入水印圖像');
w=imread('E:water1.bmp');
subplot(2,3,2);
imshow(w);
title('待用水印圖像');
w=w/255;
[cA1,cH1,cV1,cD1]=dwt2(x,'haar');% 對原始圖像x進行小波分解
[cA2,cH2,cV2,cD2]=dwt2(cA1,'haar');
[cA3,cH3,cV3,cD3]=dwt2(cA2,'haar');
title('加入水印後的圖像');
%(1)放大兩倍的操作,(當然提取之前要先縮小兩倍)
xxx1=imresize(Y,2,'bicubic');
xxx2=imresize(xxx1,1/2,'bicubic');
Y= double(xxx2);
end
%(8) JPEG壓縮
if type==8
A='JPEG壓縮,強度=10'
imwrite(uint8(round(Y)),'jpeg_n.jpg','jpg','Quality',10);%按壓縮因子Quality的比例,將J2壓縮到jpeg_n.jpg中。
end
title('提取結果');
原圖像512*512 水印64*64
函數聲明為function [a type]=myfunction(a,type)
圖像降維,是因為,音頻是一維的,所以要用到 reshape 這個函版數。
置亂權,這個 有很多種的,一般用RandStream 這個來設定亂數。
密鑰:圖像(watermark)演算法(比如XOR) 亂數 。
嵌入與提取: 根據演算法和處理方法不同方法不同。小波 一般利用平均差值 嵌入的,提取的時候可以根據與差值比較 ,大的時候1小的時候0等方法。
(7)matlab數字水印演算法擴展閱讀:
MATLAB由一系列工具組成。這些工具方便用戶使用MATLAB的函數和文件,其中許多工具採用的是圖形用戶界面。包括MATLAB桌面和命令窗口、歷史命令窗口、編輯器和調試器、路徑搜索和用於用戶瀏覽幫助、工作空間、文件的瀏覽器。隨著MATLAB的商業化以及軟體本身的不斷升級,MATLAB的用戶界面也越來越精緻,更加接近Windows的標准界面,人機交互性更強,操作更簡單。
而且新版本的MATLAB提供了完整的聯機查詢、幫助系統,極大的方便了用戶的使用。簡單的編程環境提供了比較完備的調試系統,程序不必經過編譯就可以直接運行,而且能夠及時地報告出現的錯誤及進行出錯原因分析。
㈧ matlab編程實現一種簡單的數字水印嵌入與提取方法
DCT嵌入水印圖片與DWT是擦不多的。在Matlab上直接用函數的話值是一樣的,應該說DWT包含DCT。下面我說一下嵌入過程,程序就不寫了。網上很多的。給你一個嵌入思路。
DWT方法。原圖大小為(512,512)嵌入圖片大小為(64,64)
嵌入:
讀取原圖片。
讀取水印圖片。
原圖片要處理為灰圖。
水印圖片要處理為2值圖。
生成偽隨機亂數(記住是怎麼生成的,提取時用到)。
隨機亂數做成2值圖K與水印圖生成密鑰WK的2值圖(方法有很多種)。
原圖片做3次DWT處理(Matlab里函數是dwt2)得到圖片DA,DB,DC,DD。
取出DB或DC,或者DB,DC都用上,設一個嵌入強度Q,與密鑰K一起嵌入到DB,DC中(方法有很多種)。
將嵌入後的DB,DC與沒有嵌入的DA,DD一起(DA,DB,DC,DD順序不要錯了)進行反DWT處理。
得到嵌入水印後的圖片進行保存。
提取:
讀取嵌入水印後的圖片。
嵌入水印後的圖片做3次DWT,並得到DA,DB,DC,DD。
定義Q(嵌入時的強度,比如5)。
生成嵌入水印時的偽隨機亂數並做成2值圖K。
取出,嵌入水印的成分(嵌入到DB的話取出DB,兩個都用了就兩個都取出,在這里用DB代替)。
進行嵌入時的反計算。
提取後的水印圖片進行保存。
㈨ 基於DCT數字水印演算法的Matlab實現源代碼
讀取圖片
讀取水印圖片(二維碼)
原圖片做成灰度
水印圖做成二值圖
原圖做8*8DCT處理
選擇DC成分以外的元素(每個8*8塊里選擇1個元素)
生成偽隨機亂數
根據亂數做成密鑰
將水印圖根據密鑰與演算法嵌入到第6步驟
嵌入後將每個元素替換原來的第6步元素
做反變換
圖片保存,嵌入完畢
提取
讀取嵌入水印後的圖片
生成嵌入時的偽隨機亂數(生成亂數之前可以加一些幾何攻擊)
根據亂數做成密鑰
嵌入水印後的圖片做8*8DCT處理
選擇DC成分以外的元素(選取跟原來嵌入時相同)
根據演算法與密鑰提取水印圖
提取的水印圖與原水印圖做比較
保存提取的水印圖,提取完畢
㈩ FFT域的數字水印演算法MATLAB程序運行越界出錯
怎麼你用的演算法是fft的,但是水印嵌入的卻是跟dct的一樣的.....你是不是拿了一個dct的水印嵌入程序,然後把dct直接變成fft呀.........