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 加密\),這種信息隱藏的安全性也依賴於算法本身,而不是密碼學里的『密鑰』。