導航:首頁 > 源碼編譯 > 脆弱水印圖像認證演算法代碼

脆弱水印圖像認證演算法代碼

發布時間:2022-09-22 13:20:20

㈠ 數字圖像LSB代碼

LSB演算法是數字圖像信息隱藏應用較早較普遍的演算法[3],是在圖像信息的最不重要二進制位嵌入秘密信息。根據24位BMP圖像文件的結構特點,每個文件只能非壓縮地存放一幅彩色圖像;文件頭由54個位元組的數據段組成,其中包含有該點陣圖文件的類型、大小、圖像尺寸及列印格式等;從第55個位元組開始,是該文件的圖像數據部分,由一系列的位元組所組成,每連續3個位元組便描述圖像一個像素點的顏色信息,這三個位元組分別代表藍、綠、紅三基色在此像素中的亮度。LSB演算法是用圖像數據部分每個位元組中最低位來隱藏信息。這樣每8個位元組就可隱藏1個位元組的信息[4]。
嵌入信息的方法為:首先,將待隱藏的秘密信息轉化為二進制數據碼流;然後,將BMP文件圖像數據部分的每個位元組的最低位替換為需隱藏的信息位。最後,原樣復制其他不需要繼續隱藏信息的原始數據。從對點陣圖文件的分析,得知偏移量為0x06的4個位元組為系統保留,可將被隱藏文件的大小寫入該位置,以便提取信息時提前知道有用信息的長度,提高解碼效率。對文件頭部的其他50個位元組,原樣復制即可。隱藏過程如圖1所示。

圖1. LSB圖像隱藏演算法示意圖
Fig.1 LSB data hiding algorithm
信息提取是把隱藏的信息從載體圖像中讀取出來,其過程和步驟正好與信息嵌入相反。首先,到隱藏信息後的圖像文件的0x06處讀取被隱藏信息的位元組數;然後,從0x36處開始,求取BMP文件圖像數據部分每個位元組最低位,每夠8個位元組,便將輸出的8位二進制數組成一個位元組。經過上述處理,得到一系列8位二進制數,便是隱藏信息的代碼,將代碼轉換成文本、或圖像、或聲音,就是隱藏的信息。提取過程如圖2所示。
由於原始24位BMP圖像文件隱藏信息後,其數據部分位元組數值最多變化為1,該位元組代表的像素顏色值最多隻變化了1/256,所以,已隱藏信息的BMP圖像與未隱藏信息的BMP圖像,用肉眼是看不出差別的。將信息直接嵌入像素RGB值的優點是嵌入信息的容量與所選取的掩護圖像的大小成正比。使用這種方法,一個大小為32k的24位BMP圖像文件,可以隱藏約32k/8=4k的信息(忽略文件頭不能隱藏數據的54個位元組),該方法具有較高的信息隱藏率。

圖2. LSB圖像提取演算法示意圖
Fig.2 LSB data extracting algorithm
由於該演算法是通過調整原始數據的最低位來隱藏信息,使一般用戶對於隱藏信息,在視覺和聽覺上很難察覺。但作為數字水印演算法,該演算法因其基本原理限制,所隱藏的數字水印信息是極為脆弱的,無法經受一些無損和有損的信號處理。
3 新的數字水印演算法
這種技術的改進,是在基於LSB圖像隱藏技術的基礎上,對待隱藏的水印信息進行反復的隱藏,因為圖片布滿水印信息,所以,有很強的抗剪裁能力。
對載體圖片進行剪裁後,極有可能會破壞水印信息原有的位置,使我們無法對水印信息進行定位,也就無從實現提取了。因此,這種演算法的關鍵在於如何對水印信息進行同步。下面,提出一種同步的方法:
(1)在數字水印信息前依次連續寫入同步信號0000,1111,1111數遍(4遍以上),然後寫入前標識符1001,0001,再寫入隱藏信息,最後寫入後標識符1001,0001。
(2)讀入被剪裁後的載體圖片的信息位,如果首位是0則跳過,從非0的位開始讀取,連續讀入8位,判斷該數據是否為同步字FF,如果不是同步字FF則繼續從非0的位開始讀其後的8位,直到連續讀出2組同步字FF,證明已經同步,然後一直到讀出前標識符,說明其後為隱藏信息位,讀出數據,直到讀入後標識符,說明隱藏信息已經完整的讀完,至此讀出一條完整的信息。如圖3所示,無論從第1個同步字的任何一位開始讀取,可以保證到第3個同步字時已經完成同步操作,第4個同步字完成確認同步並等待前標識的到來。

㈡ 大蝦幫幫我關於 數字水印 !!

三、應用:數字水印

消息認證與數字簽名可以應用到數字水印中。

傳統水印用來證明紙幣或紙張上內容的合法性,數字水印(digital watermark)用以證明一個數字產品的擁有權、真實性。數字水印是嵌在數字產品中的數字信息。可以是作者的序列號、公司標志、有特殊意義的文本等。

數字水印主要用於:阻止非法復制(間接的)、確定所有權(作者、發行人、分發商、合法的最終用戶)、確定作品的真實性和完整性(是否偽造、被篡改)、證實收件人、不可否認的傳送、法庭證據的驗證、贗品甄別、識別文件來源與版本、Web網路巡邏監視盜賊等。

傳統水印是人眼可以看得見的,而數字水印可以分為可感知的(Perceptible)和不易感知的(Inperceptible)兩種。

可感知的數字水印,主要用於當場聲明對產品的所有權、著作權及來源,起到一個宣傳廣告或約束的作用。可感知水印一般為較淡的或半透明的不礙觀瞻的圖案;比如電視台節目播放的同時,在某個角落插上電視台的半透明標志。另一個用途是為了在線分發作品,比如先將一個低解析度的有可見水印的圖像免費送人,其水印往往是擁有者或賣主的信息,它提供了尋找原高解析度作品的線索,若想得到高解析度的原作品則需付費。有些公司在產品出售前為了在網路上宣傳其產品,先做上可逆可見水印分發,付費購買時,再用專用軟體將可見水印去掉,加入不可見水印(發行人、分發商、最終用戶等的信息)。可見水印還有另一些用途,那就是為了節約帶寬、存儲空間等原因,在VCD、DVD等電影拷貝中用嵌入不可見水印的方式配上多種語言的副標題和字幕,待播放時由硬體根據需要實時地解出每一幀中的水印文字,將其顯示在屏幕上。

可見水印在某些產品中或多或少降低了作品的觀賞價值,使其用途相對受到一定限制。不易感知的水印的應用層次更高,製作難度更大。

不易感知的數字水印就像隱形墨水技術中的看不見的文字,隱藏在數字產品中。水印的存在要以不破壞原數據的欣賞價值、使用價值為原則。數字水印按照某種方式植入被保護的信息中,在產生版權糾紛時,通過相應的演算法提取出該數字水印,從而驗證版權的歸屬。被保護的信息可以是圖像、聲音、視頻或一般性的電子文檔等。為了給攻擊者增加去除水印的難度,大多數水印製作方案都在水印的嵌入、提取時使用密鑰。

圖5.7水印的嵌入與提取

數字水印技術雖然不能阻止盜版活動的發生,但它可以判別對象是否受到保護,監視被保護數據的傳播、真偽鑒別和非法拷貝、解決版權糾紛並為法庭提供證據。

數字水印的設計需要考慮以下幾個方面:

魯棒性:是指被保護的信息經過某種改動後抵抗隱藏信息丟失的能力。例如傳輸過程中的信道噪音、濾波操作、重采樣、有損編碼壓縮、D/ A或 A/ D轉換、圖像的幾何變換(如平移、伸縮、旋轉、剪裁等)。

不可檢測性(不可見性):是指隱蔽載體與原始載體具有一致的特性。如具有一致的統計雜訊分布等,以便使非法攔截者很難判斷是否有隱蔽信息。

透明性:是指經過一系列隱藏處理後,原始數據沒有明顯的降質現象。

安全性:要求隱藏演算法有較強的抗攻擊能力(篡改、偽造、去除水印),使隱藏信息不會被破壞。如不因文件格式轉換而丟失水印,且未經授權者不能檢測出水印。

自恢復性:由於經過一些操作或變換後,可能會使原數據產生較大的破壞,如果只從留下的片段數據,仍能恢復隱藏信號,而且恢復過程不需要原數據,這就是自恢復性(自相似性)。

水印容量:水印容量和魯棒性之間是相互矛盾的。水印容量的增加會帶來魯棒性的下降,對不可見性也有影響。為抵抗各種變換,水印通常需要按照一定的排列方式反復加入多次,當水印容量大時重復次數只好減少,而魯棒性不好就會導致檢測結果的不可靠。

數字水印技術有多種分類。

按作用可劃分為魯棒水印和脆弱水印。前者主要應用於數字作品中標志著作版權信息,需要嵌入的水印能夠抵抗常見的編輯處理和有損壓縮;後者主要用於完整性保護,判斷信號是否被篡改。

按水印的載體可分為圖像水印、視頻水印、音頻水印、文本水印和印刷水印等。

按檢測方法可分為明水印和盲水印。在檢測過程中需要原數據的技術稱為明水印,其魯棒性較強;在檢測過程中不需要原數據的技術稱為盲水印。

按內容可分為內容水印和標志水印。內容水印是指水印經過攻擊受損後人們仍能通過感覺判斷內容;標志水印是指通過檢測判斷來確定信號中是否有水印標志。

按用途可分為版權保護水印、篡改提示水印、票據防偽水印、隱蔽標識水印、印刷數字水印等。

數字水印其內容可以是任何具有代表意義的信息,如圖像、文字、數字、符號等,為了便於隱藏,水印的體積越小越好。用文本作為水印信息是較好的選擇,既節約空間又能直讀出其含義。數字水印主要應用在版權保護、加指紋、標題與注釋、篡改提示、使用控制等領域。

版權保護:即數字媒體的所有者可用密鑰產生一個水印,並將其嵌入原始數據,然後公開發布他的水印版本作品。數字媒體包括音像製品、數字廣播、DVD、MP3等。當該作品被盜版或出現版權糾紛時,所有者即可從盜版作品或水印版作品中獲取水印信號作為依據,從而保護所有者的權益。

版權跟蹤:為避免未經授權的拷貝製作和發行,出品人可以將不同用戶的ID或序列號作為不同的水印嵌入作品的合法拷貝中,稱為數字指紋。其目的是通過授權用戶的信息來識別數據的發行拷貝,監控和跟蹤使用過程中的非法拷貝。一旦發現未經授權的拷貝,就可以根據此拷貝所恢復出的指紋來確定它的來源。

標題與注釋:即將作品的標題、注釋等內容以水印形式嵌入該作品中,這種隱式注釋不需要額外的帶寬,且不易丟失。如在遙感圖像等信息中隱藏日期、經緯度等。

篡改提示:當數字作品被用於法庭、醫學、新聞及商業時,常需確定它們的內容是否被修改、偽造或特殊處理過。為實現該目的,通常可將原始圖象分成多個獨立塊,再將每個塊加入不同的水印。同時可通過檢測每個數據塊中的水印信號,來確定作品的完整性。與其他水印不同的是,這類水印必須是脆弱的,並且檢測水印信號時,不需要原始數據。

使用控制:這種應用的一個典型的例子是DVD防拷貝系統,即將水印信息加入DVD數據中,這樣DVD播放機即可通過檢測DVD數據中的水印信息而判斷其合法性和可拷貝性。從而保護製造商的商業利益。

典型數字水印演算法包括以下幾種演算法。

空域演算法:此演算法首先把一個密鑰輸入一個m-序列發生器來產生水印信號,然後排列成2維水印信號,按象素點逐一嵌入到原始圖象最不重要的像素位棗最低位(LSB:least significant bits)。這可保證嵌入的水印是不可見的。但是由於使用了圖像不重要的像素位,演算法的魯棒性差,水印信息很容易為濾波、圖像量化、幾何變形的操作破壞,因此不夠強壯。

文本水印演算法:通過輕微改變字元間距,行間距或是增加、刪除字元特徵如底紋線等方法來嵌入水印。或是在符號級或語義級加入水印,例如,可以用big替換文本中的large。

基於改變圖象數據統計特性的水印演算法:Patchwork演算法首先隨機選取N對象素點,然後通過增加象素對中一個點的亮度值,而相應降低另一個點的亮度值。這樣整個圖像的平均亮度保持不變。適當地調整參數,Patchwork方法對JPEG壓縮、FIR濾波以及圖像裁剪有一定的抵抗力,但該方法嵌入的信息量有限。

頻域演算法:它是利用一個信號可以掩蓋另一個較弱的信號這一頻率掩蓋現象。圖象的頻域空間中可以嵌入大量的比特而不引起可察的降質,當選擇改變中頻或低頻分量(除去直流分量)來加入水印時,強壯性可大大提高。頻域水印技術可以利用通用的離散餘弦變換,小波變換和傅立葉變換等變換方法。其優點是隱藏效果好,人眼不能發覺與原始圖象間的差別;使用密鑰控制,只有知曉偽裝密鑰的人才能解密;可以有效的抵抗剪切及JEPG等有損壓縮編碼;水印圖象可以是灰度圖象。但該類演算法的隱藏和提取信息操作復雜,隱藏信息量不能很大。

壓縮域演算法:水印檢測與提取直接在壓縮域數據中進行。把水印信號加到表示視頻幀的數據流中去。MPEG-2數據流可分為數據頭信息、運動向量(用於運動補償)和DCT編碼信號塊3部分,該演算法只有DCT編碼信號塊被改變。首先對DCT編碼數據塊中每一輸入的Huffman碼進行解碼和逆量化,以得到當前數據塊的一個DCT系數;其次,把相應水印信號塊的變換系數與之相加,從而得到水印疊加的DCT系數,再重新進行量化和Huffman編碼,最後對新的Huffman碼字的位數n1與原來的無水印系數的碼字n0進行比較,只在n1不大於n0的時候,才傳輸水印碼字,否則傳輸原碼字,這就保證了不增加視頻數據流位率。該方法中水印信號的引入是一種引起降質的誤差信號,而基於運動補償的編碼方案會將一個誤差擴散和累積起來,為解決此問題,該演算法採取了漂移補償的方案來抵消因水印信號的引入所引起的視覺變形。

NEC演算法:該演算法由NEC實驗室的COX等人提出,在數字水印演算法中佔有重要地位。COX認為水印信號應該嵌入源數據中對人的感覺最重要的部分。在頻譜空間中,這種重要部分就是低頻分量。這樣,攻擊者在破壞水印的過程中,不可避免地會引起圖象質量的嚴重下降。水印信號應該由具有高斯分布的獨立同分布隨機實數序列構成。這使得水印經受多拷貝聯合攻擊的能力大大增強。實現方法是:首先以密鑰為種子來產生偽隨機序列,該序列具有高斯N(0,1)分布,密鑰一般由作者的標識碼和圖象的哈希值組成,對整幅圖象做DCT變換,用偽隨機高斯序列來調制(疊加)該圖象除直流分量(DC)外的1000個最大的DCT系數。該演算法具有較強的魯棒性、安全性、透明性等。

生理模型演算法:人的生理模型包括人類視覺系統HVS(HumanVisualSystem)和人類聽覺系統HAS。利用視覺模型的基本思想是利用從視覺模型導出的JND(Just Noticeable Difference)描述來確定在圖象的各個部分所能容忍的數字水印信號的最大強度,從而能避免破壞視覺質量。也就是說,利用視覺模型來確定與圖象相關的調制掩模,然後再利用其來插入水印。這一方法同時具有好的透明性和強健性。

數字水印在版權標識、隱藏標識和篡改提示、數據防偽上具有不可替代的作用,它將在商業、金融、軍事和個人消費上帶來巨大的商業利潤。自1995年以來,該領域的研究工作已經取得了巨大的進展。隨著數字水印技術的日趨成熟,數字水印技術將在電子商務、視頻點播、遠程教學和遠程培訓中發揮越來越大的作用。

㈢ 圖像水印的LSB演算法,VC++代碼

因為8位像素值的最低位為1或0對整個像素值影響不大,LSB就是把水印信息放入這個最低位,同時保證原始圖像基本無變化

void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP圖像數據
unsigned char efdata;//嵌入的文件數據
int t = 7;
int x[8];
int s[8];
int last_bit; //記錄位元組最低位本來的bit

for(UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{ //生產隱藏信息,並逐步嵌入到宿主圖像各像素的最低位上
bmdata = *p;//p指向圖像數據的每個像素,把當前像素值給bmdata

for (int j = 0; j <= 7; j++) //計算各bit位
{
x[j] = bmdata & 1;//提出bmdata最低位放入x[j]
bmdata >>= 1;//右移一位
}

last_bit = x[0];//原始圖像的最低位值存入last_bit中
x[0] = x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//使最低位值等於其他各位的異或

if (t == 7) //宿主圖片每走過八個位元組,計算一次s[]
{
efdata = *q;//q指向插入的水印數據
for (j = 0; j <= 7; j++)
{
s[j] = efdata & 1;//水印數據依次放入s[j]中
efdata >>= 1;//右移
}
}
x[0] ^= s[t];//隱藏信息,隱藏信息等於原圖像高六位的異或再和文件數據異或
if (last_bit == 0) //嵌入隱藏信息
{
*p |= x[0];//如果該像素原本最低位為0;則將最終得到的異或水印值放入原像素
}
else
{
*p &= 254 + x[0]; //如果該像素原本最低位為1;則將最終得到的異或水印值放入原像素
}

p++;//指向下一個像素
t--;//t用來定時每8個位元組插入一次完整的s
if (t == -1) //需要計算一次s[]
{
t = 7;
q++;//指向下一個作為待插入水印的文件數據
i2++;
}
}

}

void CDib::Pick()//提取
{
m_pFile = new unsigned char [embfile_size];//開辟等於插入文件數據大小的內存
unsigned char *q = m_pFile;//q指向該內存

unsigned char bmdata;//插入了水印的BMP圖像數據

int x[8];
int s[8];
int t = 7;
for (UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{
bmdata = *p; //p指向插入了水印的圖像數據
for (int j = 0; j <= 7; j++) //計算各bit位
{
x[j] = bmdata & 1;//提取該圖像位元組的0~7位放入X[]數組
bmdata >>= 1;
}
s[t] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//提取1~8個位元組中的s[]
t--;
if (t == -1) //s[7]到s[0]組成一個位元組
{
*q = s[7] * 128 + s[6] * 64 + s[5] * 32 + s[4] * 16 +
s[3] * 8 + s[2] * 4 + s[1] * 2 + s[0];//還原原始的圖像數據
t = 7;
i2++;
q++;
}
p++;//指向下一像素
}

}

㈣ 遺傳演算法實現數字水印用MATLAB,程序怎麼寫啊可以把我的積分都給了你

一、嵌入水印信息的MATLAB程序
首先讀入原始圖象並設置參數,然後嵌入水印信息,程序代碼如下:
clear
%
%讀入原圖象
trueImage=imread('C:\Documents and Settings\ks001\My Documents\My Pictures\lean.tif');
alfa=.1;
LENGTH=2500;
subplot(2,2,1);
imshow(trueImage);
title('原始圖象');
%
%對原圖象進行DCT變換
dctF1=dct2('C:\Documents and Settings\ks001\My Documents\My Pictures\lean.tif');
subplot(2,2,2);
imshow(log(abs(dctF1)),[ ]);
title('DCT cofficient matrix');
[m,n]=size(dctF1);
%
%產生水印序列並對其排序
radon('right',10);
watermark1=radon(LENGTH,1);
subplot(2,2,3);
title('watermark seqence')
[Y0,I0]=sort(watermark1);
%
%找出水印嵌入位置(幅值較大的n個頻域成分)
A=dctF1(:);
[Y1,I1]=sort(A);
x=m*n;
k=LENGTH;
M=zeros(x,1);
%
%修改幅值較大的n個頻域成分的幅值,嵌入水印(因為兩個問題不同,所以有兩個注釋符)
for i=1:x
if k>=1
M(x)=Y1(x)*(1+alfa*Y0(k));
k=k-1;
else
M(x)=Y1(x);
end
x=x-1;
end
N=zeros(x,1);
x=m*n;
for i=1:x
N(I1(i))=M(i);
end
a=1;
for j=1:n
for i=1:m
dctF2(i,j)=N(a);
a=a+1;
end
end
%
%DCT反變換,得到嵌入水印的圖象
idctF1=idct2(dctF2);
subplot(2,2,4);
imshow(idctF1,[ ]);
title('嵌入水印後的圖象');
end

二、提取恢復水印信息的MATLAB程序
水印提取過程是水印嵌入過程的逆過程,相對嵌入過程來說比較復雜,難度較大,下面是水印提取檢測的MATLAB程序代碼:
function watermark_detect(image,Y1,I0,waterMark1)
%image:嵌入水印的圖象
%Y1:原始圖象的序列排序
%I0:原始水印的序列排序
%waterMark1:原始水印序列
%
%對嵌入水印圖象進行DCT變化
dctW1=dct2(image);
%
%找出幅值較大的系數
B=dtW1(:);
[Y1,I2]=sort(B);
[m1,n1]=size(dctW1);
y=m1*n1;
k=length(waterMark1);
N0=zeros(k,1);
%
%提取水印序列
while k>=1
N0(k)=(Y2(y)-Y1(y))/alfa/Y1(y);
k=k-1;
y=y-1;
end
k=length(waterMark1);
waterMark2=zeros(k,1);
for i=1:k
waterMark2(I0(i))=N0(i);
end
%
%選取50個測試序列,其中第10個為提取出的水印
figure;
for i=1;50
if i==10;
waterMark=waterMark2;
else
waterMark=rand(k,1);
end
%計算各個序列與原來水印序列的相關值
c=waterMark'*waterMark1/sqrt(waterMark'*waterMark);
stem(i,c);
hold on;
end
%

三、接下來對嵌入水印的圖象進行不同的攻擊,用以測試水印的魯棒性。
程序的目的和程序代碼如下:
%
%攻擊實驗
disp('input you choice according to the following
image processing operation:');
disp('0--exit');
disp('1--smoothing patterns');
%添加噪音
disp('2--adding uniorm noise 添加噪音');
%濾波
disp('3--adding filter [10 10] 濾波');
%剪切
disp('4--cutting part of the image 剪切');
%壓縮
disp('5--10 quality JPEG compressing 壓縮');
%旋轉45度
disp('6--rotate 45 旋轉');
%
d=input('please input you choice(請輸入您的選擇):');
while d~=0
switch d
case 1
watermark_detect(idctF1,Y1,I0,waterMark1);
case 2
WImage2=idctF1;
noise0=10*rand(size(WImage2));
WImage2=WImage2+noise0;
figure;
imshow(WImage2,[ ]);
title('adding uniform noise 添加噪音');
watemark_detect(WImage2,Y1,I0,waterMark1);
case 3
WImage3=idctF1;
H=fspcial('gaussian高斯',[10,10],5);
WImage3=imfilter(WImage3,H);
figure;
imshow(WImage3,[ ]);
title(through filter [10,10] 濾波');
watemark_detect(WImage3,Y1,I0,waterMark1);
case 4
WImage4=idctF1; WImage4(1:128,1;128)=256;
figure;
imshow(WImage4);
title('cutting part of the image 剪切');
watemark_detect(WImage4,Y1,I0,waterMark1);
case 5
WImage5=idctF1;
WImage5=im2double(WImage5);
cnum=10;
dctm=dctmtx(8);
p1=dctm;
p2=dctm.';
imageDCT=blkproc(WImage5,[8,8],'p1*p2*x',dctm,dctm.');
DCTvar=im2col(imageDCT,[8,8],'distinct').';
n=size(DCTvar,1);
DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
[m,order]=sort(DCTvar);
cnum=64-cnum;
mask=ones(8,8);
mask(order(1:cnum))=zeros(1,cnum);
im88=zeros(9,9);
im88(1:8,1:8)=mask;
im128128=kron(im88(1:8,1:8),ones(16));
dctm=dctmtx(8);
p1=dctm.';
p2=mask(1;8,1:8);
p3=dctm;
Wimage5=bikproc(imageDCT,[8,8],'p1*(x.8p2)*p3',dctm.',mask(1:8,1:8),dctm);
figure;
imshow(Wimage5);
title('JPEG Image 壓縮');
watemark_detect(WImage5,Y1,I0,waterMark1);
case 6 WImage6=idctF1;
WImage6=imrotate(WImage6,45,'bilinear','corp');
figure;
imshow(Wimage6);
title('rotate 45 旋轉');
watemark_detect(WImage6,Y1,I0,waterMark1);
case 0
break;
otherwise
error('you have a valid value(您的輸入錯誤)');
end
d=input('please input you choice(請輸入您的選擇):');
end
%結束

㈤ Motorola lsb計算方法

計算方法如下:
LSB演算法的基本原理:
對空域的LSB做替換,用來替換LSB的序列就是需要加入的水印信息、水印的數字摘要或者由水印生成的偽隨機序列。由於水印信息嵌入的位置是LSB,為了滿足水印的不可見性,允許嵌入的水印強度不可能太高。然而針對空域的各種處理,如遊程編碼前的預處理,會對不顯著分量進行一定的壓縮,所以LSB演算法對這些操作很敏感。因此LSB演算法最初是用於脆弱性水印的。
LSB演算法基本步驟:
1、將原始載體圖像的空域像素值由十進制轉換成二進制;
2、用二進制秘密信息中的每一比特信息替換與之相對應的載體數據的最低有效位;
3、將得到的含秘密信息的二進制數據轉換為十進制像素值,從而獲得含秘密信息的圖像。

㈥ DCT域圖像數字水印演算法

%嵌入水印的程序代碼
clear
clc
M =512;%原圖像長度
N =64;%水印圖像長度
K =8;
I=zeros(M,M);J=zeros(N,N);BLOCK=zeros(K,K);
%顯示原圖像
subplot(2,3,1);
I=imread('liftingbody.png','png');imshow(I);title('原始公開圖像');
%顯示水印圖像
subplot(2,3,2);
J=imread('shuiyin.bmp','bmp');imshow(J);title ('水印圖像');
%水印嵌入
for p=1:N
for q=1:N
x=(p-1)*K+1; y=(q-1)*K+1;
BLOCK =I(x:x+K-1,y:y+K-1);BLOCK=dct2(BLOCK);
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK(1,1)=BLOCK(1,1)*(1+a*0.03);BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
%顯示嵌入水印後的圖像
subplot(2,3,3);
imshow(I);title('嵌入水印後的圖像');
imwrite(I,'watermarked.bmp','bmp');
%從嵌入水印的圖像中提取水印
I=imread('liftingbody.png','png');
J=imread('watermarked.bmp','bmp');
J=imnoise(J,'gaussian',0,0.01);
subplot(2,3,4);imshow(J,[]);title('加入高斯雜訊');
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1 =I(x:x+K-1,y:y+K-1);
BLOCK2 =J(x:x+K-1,y:y+K-1);
BLOCK1=dct2(BLOCK1);
BLOCK2=dct2(BLOCK2);
a = BLOCK2(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
%顯示提取的水印
subplot(2,3,5);
imshow(W);
title('從含水印圖像中提取的水印');
至於分析演算法對雜訊攻擊的抵抗性能.你需要計算PSNR和相關系數NC就可以了

㈦ 如何給JPEG圖像加水印,要VC代碼(急)

本問介紹了GDI+支持的大多數圖像文件格式,以及GDI+提供的處理圖像的文件的兩個類:Image和Bitmap 我們知道,在以往的圖像處理中,常常要根據不同圖像文件的格式及其數據存儲結構在不同格式中進行轉換。某個圖像文件的顯示也是依靠對文件數據結構的剖析,然後讀取相關圖像數據而實現的。現在,GDI+提供了Image和Bitmap類使我們能輕松容易地處理圖像。

概述

GDI+支持大多數流行的圖像文件格式,如BMP、GIF、JPEG、TIFF和PNG等。下面先來介紹這些圖像文件,然後再說明Image和Bitmap類支持的特性。

1.圖像文件格式簡介

圖像文件是描繪一幅圖像的計算機磁碟文件,其文件格式不下數十種。這里僅介紹BMP、GIF、JPEG、TIFF和PNG等圖像文件格式。

BMP文件格式

BMP圖像文件格式是Microsoft為其Windows環境設置的標准圖像格式。一個Windows的BMP點陣圖實際上是一些和顯示像素相對應的位陣列,它有兩種類型:一種稱之為GDI點陣圖,另一種是DIB點陣圖(Device-Independent Bitmap)。GDI點陣圖包含了一種和Windows的GDI模塊有關的Windows數據結構,該數據結構是與設備有關的,故此點陣圖又稱為DDB點陣圖(Device-Dependent Bitmap)。當用戶的程序取得點陣圖數據信息時,其點陣圖顯示方式視顯示卡而定。由於GDI點陣圖的這種設備依賴性,當點陣圖通過網路傳送到另一台PC,很可能就會出現問題。

DIB比GDI點陣圖有很多編程優勢,例如它自帶顏色信息,從而使調色板管理更加容易。且任何運行Windows的機器都可以處理DIB,並通常以後綴為.BMP的文件形式被保存在磁碟中或作為資源存在於程序的EXE或DLL文件中。

GIF文件格式

圖形交換格式(GIF--Graphics Interchange Format)最早由CompuServe公司於1987年6月15日制定的標准,主要用於CompuServe網路圖形數據的在線傳輸、存儲。GIF提供了足夠的信息並很好地組織了這些信息,使得許多不同的輸入輸出設備能夠方便地交換圖像,它支持24位彩色,由一個最多256種顏色的調色板實現,圖像的大小最多是64K x 64K個像點。GIF的特點是LZW壓縮、多圖像和交錯屏幕繪圖。

JPEG文件格式

國際標准化組織(ISO)和國際電報電話咨詢委員會(CCITT)聯合成立的"聯合照片專家組"JPEG(Joint Photographic Experts Group)經過五年艱苦細致工作後,於1991年3月提出了ISO CD 10918號建議草案:"多灰度靜止圖像的數字壓縮編碼"(通常簡稱為JPEG標准)。這是一個適用於彩色和單色多灰度或連續色調靜止數字圖像的壓縮標准。它包括無損壓縮和基於離散餘弦變換和Huffman編碼的有損壓縮兩個部分。前者不會產生失真,但壓縮比很小;後一種演算法進行圖像壓縮時,信息雖有損失但壓縮比可以很大。例如壓縮20~40倍時,人眼基本上看不出失真。

JPEG圖像文件也是一種像素格式的文件格式,但它比BMP等圖像文件要復雜許多。所幸的是,GDI+的Image提供了對JPEG文件格式的支持,使得我們不需要對JPEG格式有太多的了解就能處理該格式的圖像。

TIFF文件格式

TIFF(Tagged Image Format File,標志圖像文件格式)最早由Als公司於1986年推出的,它能對從單色到24位真彩的任何圖像都有很好的支持,而且在不同的平台之間的修改和轉換是十分容易的。與其它圖像文件格式不同的是,TIFF文件中有一個標記信息區用來定義文件存儲的圖像數據類型、顏色和壓縮方法。

PNG文件格式

PNG(Portable Network Graphic,可移植的網路圖像)文件格式是由Thomas Boutell、Tom Lane等人提出並設計的,它是為了適應網路數據傳輸而設計的一種圖像文件格式,用於取代格式較為簡單、專利限制嚴格的GIF圖像文件格式。而且,這種圖像文件格式在某種程度上甚至還可以取代格式比較復雜的TIFF圖像文件格式。它的特點主要有:壓縮效率通常比GIF要高、提供Alpha通道控制圖像的透明度、支持Gamma校正機制用來調整圖像的亮度等。

需要說明的是,PNG文件格式支持三種主要的圖像類型:真彩色圖像、灰度級圖像以及顏色索引數據圖像。JPEG只支持前兩種圖像類型,而GIF雖然可以利用灰度調色板補償圖像的灰度級別,但原則上它僅僅支持第三種圖像類型。

mage和Bitmap類概述

GDI+的Image類封裝了對BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增強WMF)圖像文件的調入、格式轉換以及簡單處理的功能。而Bitmap是從Image類繼承的一個圖像類,它封裝了Windows點陣圖操作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分別用來對點陣圖進行讀寫像素操作,從而可以為圖像的柔化和銳化處理提供一種可能。

3.DrawImage方法

DrawImage是GDI+的Graphics類顯示圖像的核心方法,它的重載函數有許多個。常用的一般重載函數有:

Status DrawImage( Image* image, INT x, INT y);
Status DrawImage( Image* image, const Rect& rect);
Status DrawImage( Image* image, const Point* destPoints, INT count);
Status DrawImage( Image* image, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unit srcUnit);
其中,(x,y)用來指定圖像image顯示的位置,這個位置和image圖像的左上角點相對應。rect用來指定被圖像填充的矩形區域, destPoints和count分別用來指定一個多邊形的頂點和頂點個數。若count為3時,則表示該多邊形是一個平行四邊形,另一個頂點由系統自動給出。此時,destPoints中的數據依次對應於源圖像的左上角、右上角和左下角的頂點坐標。srcx、srcy、srcwidth 和srcheight用來指定要顯示的源圖像的位置和大小,srcUnit用來指定所使用的單位,默認時使用PageUnitPixel,即用像素作為度量單位。

調用和顯示圖像文件

在GDI+中調用和顯示圖像文件是非常容易的,一般先通過Image或Bitmap調入一個圖像文件構造一個對象,然後調用Graphics::DrawImage方法在指定位置處顯示全部或部分圖像。例如下面的代碼:
void CEx_GDIPlusView::OnDraw(CDC* pDC)
{
CEx_GDIPlusDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

using namespace Gdiplus;
Graphics graphics( pDC->m_hDC );

Image image(L"sunflower.jpg");
graphics.DrawImage(&image, 10,10);

Rect rect(130, 10, image.GetWidth(), image.GetHeight());
graphics.DrawImage(&image, rect);
}
結果如圖7.17所示,從圖中我們可以看出,兩次DrawImage的結果是不同的,按理應該相同,這是怎麼一回事?原來,DrawImage在不指定顯示區域大小時會自動根據設備解析度進行縮放,從而造成顯示結果的不同。

當然,也可以使用Bitmap類來調入圖像文件來構造一個Bitmap對象,其結果也是一樣的。例如,上述代碼可改為:
Bitmap bmp(L"sunflower.jpg");
graphics.DrawImage(&bmp, 10,10);

Rect rect(130, 10, bmp.GetWidth(), bmp.GetHeight());
graphics.DrawImage(&bmp, rect);
需要說明的是,Image還提供GetThumbnailImage的方法用來獲得一個縮略圖的指針,調用DrawImage後可將該縮略圖顯示,這在圖像預覽時極其有用。例如下面的代碼:
Graphics graphics( pDC->m_hDC );
Image image(L"sunflower.jpg");
Image* pThumbnail = image.GetThumbnailImage(50, 50, NULL, NULL);

// 顯示縮略圖
graphics.DrawImage(pThumbnail, 20, 20);

// 使用後,不要忘記刪除該縮略圖指針
delete pThumbnail;

圖像旋轉和拉伸

圖像的旋轉和拉伸通常是通過在DrawImage中指定destPoints參數來實現,destPoints包含對新的坐標系定義的點的數據。圖7.18說明了坐標系定義的方法。

從圖中可以看出,destPoints中的第一個點是用來定義坐標原點的,第二點用來定義X軸的方法和圖像X方向的大小,第三個是用來定義Y軸的方法和圖像Y方向的大小。若destPoints定義的新坐標系中兩軸方向不垂直,就能達到圖像拉伸的效果。

下面的代碼就是圖像旋轉和拉伸的一個示例,其結果如圖7.19所示。
Image image(L"sunflower.jpg");
graphics.DrawImage(&image, 10,10);

Point points[] = { Point(0, 0), Point(image.GetWidth(), 0),
Point(0, image.GetHeight())};
Matrix matrix(1,0,0,1,230,10); // 定義一個單位矩陣,坐標原點在(230,10)
matrix.Rotate(30); // 順時針旋轉30度

matrix.Scale(0.63,0.6); // X 和 Y 方向分別乘以0.63和0.6比例因子
matrix.TransformPoints(points, 3); // 用該矩陣轉換points
graphics.DrawImage(&image, points, 3);

Point newpoints[] = {Point(450, 10), Point(510, 60), Point(350, 80)};
graphics.DrawImage(&image, newpoints, 3);

當然,對於圖像旋轉還可直接使用Graphics::RotateTransform來進行,例如下面的代碼。但這樣設置後,以後所有的繪圖結果均會旋轉,有時可能感覺不方便。
Image image(L"sunflower.jpg");
graphics.TranslateTransform(230,10); // 將原點移動到(230,10)
graphics.RotateTransform(30); // 順時針旋轉30度
graphics.DrawImage(&image, 0,0);

調整插補演算法的質量

當圖像進行縮放時,需要對圖像像素進行插補,不同的插補演算法其效果是不一樣的。Graphics:: SetInterpolationMode可以讓我們根據自己的需要使用不同質量效果的插補演算法。當然,質量越高,其渲染時間越長。下面的代碼就是使用不同質量效果的插補演算法模式,其結果如圖7.20所示。 Graphics graphics( pDC->m_hDC );
Image image(L"log.gif");
UINT width = image.GetWidth();
UINT height = image.GetHeight();

// 不進行縮放
graphics.DrawImage( &image,10,10);

// 使用低質量的插補演算法
graphics.SetInterpolationMode();
graphics.DrawImage( &image,
Rect(170, 30, (INT)(0.6*width), (INT)(0.6*height)));

// 使用中等質量的插補演算法
graphics.SetInterpolationMode();
graphics.DrawImage( &image,
Rect(270, 30, (INT)(0.6*width), (INT)(0.6*height)));

// 使用高質量的插補演算法
graphics.SetInterpolationMode();
graphics.DrawImage( &image,
Rect(370, 30, (INT)(0.6*width), (INT)(0.6*height)));

事實上,Image功能還不止這些,例如還有不同格式文件之間的轉換等。但這些功能和MFC的新類CImage功能基本一樣,但CImage更符合MFC程序員的編程習慣,因此下一節中我們來重點介紹CImage的使用方法和技巧。

㈧ 基於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板塊

㈨ 什麼是脆弱水印哪位高手詳細介紹一下啊 謝謝了

一般用於數據認證的數字水印又可以分為兩類:脆弱水印,半脆弱水印.脆弱水印是一種在數字圖像作品發生任何形式的改變時都無法檢測出來的水印;半脆弱水印一般指能承受圖像進行諸如JPEG壓縮、加少量雜訊的偶然修改,但會被圖像內容的惡意篡改損壞的水印.

閱讀全文

與脆弱水印圖像認證演算法代碼相關的資料

熱點內容
反編譯自己製作的軟體 瀏覽:33
ros用c還是python好 瀏覽:76
安卓九系統提醒怎麼關 瀏覽:654
我的世界伺服器有領地怎麼抄家 瀏覽:34
python實現多態 瀏覽:300
幼師pdf 瀏覽:941
你怎麼用python開發游戲 瀏覽:645
雷霆戰機伺服器異常是什麼問題 瀏覽:669
程序員客棧20 瀏覽:254
化妝pdf下載 瀏覽:923
takla伺服器ip地址 瀏覽:357
歐盟加密資產法律 瀏覽:573
威綸通反編譯密碼是多少 瀏覽:201
51單片機有40個外部引腳 瀏覽:956
山西撥號伺服器雲空間 瀏覽:714
python中階乘怎麼計算 瀏覽:530
linux查看塊大小 瀏覽:554
空調壓縮機壓力低 瀏覽:184
pdf怎麼復制粘貼文字 瀏覽:575
網上認證系統認證伺服器地址 瀏覽:302