Python實現圖像信息隱藏


Python實現圖像信息隱藏

之前學習密碼學的時候老師有提到過『信息隱藏』,現在用圖像的方法嘗試一下。思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢復過來

原理

  • 從源圖中提取文字圖像信息,記錄這個文字圖像信息像素點在圖像矩陣中的位置
  • 載體圖片進行預處理,將B通道的像素值全部設置成偶數
  • 載體圖片中,把第一步已經記錄的位置的像素B通道設置為奇數
  • 信息解碼的過程就是逆過程,只要找出載體圖片中B通道是奇數的像素位置,然后統一着色就可以恢復

實現

一、寫入要隱藏的信息

source = cv2.imread('img/source.png')
h, w = source.shape[:2]
message = 'Hello World!'
x, y = (180, 250)
color = [88, 26, 16]
cv2.putText(source, message, (x, y), cv2.QT_FONT_BLACK, 3, color, thickness=5)
cv2.imwrite('img/s.png', source)

原圖source.png

加入信息后的圖片s.png

二、預處理載體圖片

carrier = cv2.imread('img/carrier.png')
for i in xrange(h):
    for j in xrange(w):
        # 把整幅圖的B通道全設置為偶數
        if carrier[i, j, 0] % 2 == 1:
            carrier[i, j, 0] -= 1

三、把隱藏信息的位置設置成奇數

for i in xrange(h):
    for j in xrange(w):
        # 找出有文字的位置
        if list(source[i, j]) == color:
            carrier[i, j, 0] += 1
cv2.imwrite('img/hide.png', carrier)

加入信息之后的載體圖片與原來幾乎不變

原載體圖片carrier.png

隱藏信息后的圖片hide.png

四、信息恢復

img = cv2.imread('img/hide.png')
h, w = img.shape[:2]
# 新建一張圖用來放解出來的信息
info = np.zeros((h, w, 3), np.uint8)
for i in xrange(h):
    for j in xrange(w):
        # 發現B通道為奇數則為信息的內容
        if img[i, j, 0] % 2 == 1:
            info[i, j, 0] = 255
            info[i, j, 1] = 255
            info[i, j, 2] = 255
cv2.imwrite('img/info.png', info)

恢復結果info.png

小結

這種信息隱藏的方法,主要是用『修改像素奇偶性后,圖片變化不明顯』來實現的,感覺非常巧妙。

不過值得注意的是,\(隱寫術\neq 加密\),這種信息隱藏的安全性也依賴於算法本身,而不是密碼學里的『密鑰』。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM