DCT域三點法隱寫提取算法(matlab)

三點法的隱寫算法原理

原理:利用DCT中頻係數中的三個係數之間的相對關係來對祕密信息進行編碼。

具體實現

(1)選取三個位置,我選擇的是(2,3)(3,2)(4,1)這三個點
(2)首先規定:當B(2,3)>B(3,2)>B(4,1)的時候,這個塊表示嵌入1;
其次當B(2,3)<B(3,2)<B(4,1)的時候,這個塊表示嵌入0;
    當B(2,3)<B(4,1)<B(3,2)或者B(2,3)>B(4,1)>B(3,2)的時候,這個塊表示無效塊。
(3)If 要嵌入的信息=0時
首先判斷
if B(2,3)>B(3,2)>B(4,1) ,說明需要對這個快進行修改所以exchange(B(4,1),B(3,2))。原因:如果強行將這個改爲B(2,3)<B(3,2)<B(4,1)所做的修改比較大,所以這裏我們直接將它變爲無效塊,然後continue。
If not: 
If B(2,3)<B(3,2)<B(4,1) ,說明不需要做修改,這是最理想的情況。直接continue跳過。
If B(2,3)>B(3,2),說明這兩個關係是需要做出修改的,所以我們exchange(B(2,3),B(3,2)),然後continue。
If B(3,2)>B(4,1),說明這兩個點的關係是需要做出修改的,所以進行exchange(B(3,2),B(4,1))將他們進行交換。然後continue結束。
(4)If 要嵌入的信息=1時:
首先判斷:
if B(2,3)<B(3,2)<B(4,1) ,說明需要對這個快進行修改所以exchange(B(4,1),B(3,2))。原因:如果強行將這個改爲B(2,3)>B(3,2)>B(4,1)所做的修改比較大,所以這裏我們直接將它變爲無效塊,然後continue。
If not: 
If B(2,3)>B(3,2)>B(4,1) ,說明不需要做修改,這是最理想的情況。直接continue跳過。
If B(2,3)<B(3,2),說明這兩個關係是需要做出修改的,所以我們exchange(B(2,3),B(3,2)),然後continue。
If B(3,2)<B(4,1),說明這兩個點的關係是需要做出修改的,所以進行exchange(B(3,2),B(4,1))將他們進行交換。然後continue結束。
(5)當完成以上的操作之後,所有的信息其實已經隱寫到了我們的目標圖片中,但是還需要考慮隱藏的健壯性,也就是還需要一個參數D,作用是防止由於傳輸或者轉換過程中的噪聲或者其他因素的影響導致的相近DCT|數值的兩個點的大小關係的偶然變化。這樣就可能導致本來是一個無效塊但是可以讀出信息,這樣的話就會影響信息的提取。
在這裏我的方法是對每一個塊再進行一次操作,
If B(2,3)>B(3,2)>B(4,1)
B(2,3)=B(2,3)+D
B(4,1)=B(4,1)-D
Else: 
If B(2,3)<B(3,2)<B(4,1)
B(2,3)=B(2,3)-D
B(4,1)=B(4,1)+D
這樣就完成了對於隱藏健壯性的提高。

三點法的隱提取算法原理

原理:根據隱寫時候的算法的原理(
當B(2,3)>B(3,2)>B(4,1)的時候,這個塊表示嵌入1;
其次當B(2,3)<B(3,2)<B(4,1)的時候,這個塊表示嵌入0;
當B(2,3)<B(4,1)<B(3,2)或者B(2,3)>B(4,1)>B(3,2)的時候,這個塊表示無效塊。

我們逐個對塊的B(2,3)>,B(3,2),B(4,1)的大小關係進行判斷。
If B(2,3)>B(3,2)>B(4,1):
則提取出1
Else :
If B(2,3)<B(3,2)<B(4,1):
則提取出0
Else
跳過,查找下一個塊。

代碼

這裏由於我後續的需要,我給的是兩點法的代碼,其中只需要按照上面我描述的僞代碼對隱寫和提取部分的if else部分進行很少的修改。
gitee地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章