一種簡單的圖像隱寫


從開源中國博客搬到這里,進行博客合並

簡單介紹一種將信息隱藏在圖像像素中的方法。主要步驟如下

摘要

  • ①隱藏信息:
    • 首先找到一張圖片,將其某一通道的像素值[如R]全部取偶數;
    • 將想要隱藏的信息寫在一張小於等於這張圖片的圖片上;
    • 通過讀取寫有隱藏信息的圖片的像素值,將載體圖片同等坐標的R像素值改成奇數。
  • ②信息提取:
    • 創建一張空白圖片:遍歷有隱藏信息的圖片,尋找R值為奇數的坐標;
    • 在空白圖片對應的坐標設置一種顏色;
    • 輸出創建的圖片。

其實看完摘要,基本上原理就已經很明白了,就是通過一個全偶數的“刻板”,將刻字內容刻在上面就是把對應的地方改成奇數。提取的時候把奇數部分“翻印”出來就行了。下面看一下實現。

step1:找到一張圖片[BMP格式],並將其所有的R通道值改成偶數

為什么非得是bmp?我昨天也被圖片格式給整了一把,簡單來說,在我們比較熟知的集中圖片格式中,如png、jpeg、bmp,只有bmp是無壓縮的,我們可以精准的控制像素值。jpg圖像由於受到的壓縮的影響,像素值有1-3的波動,這還怎么搞啊。。。昨天我用PIL搞了一下午都在奇怪為什么圖片保存后,像素值不是我設定好的。怒了就用C讀取bmp圖片試了一下成功了(純c就能很簡單的解析bmp),發現可以正常實現,就想到了圖片格式這個梗。對於圖片格式的細節我不想去細細研究,我就想得到圖片的數據矩陣,改變矩陣值。所以就用bmp圖片了。

偽代碼如下:

for i in range(w):
    for j in range(h):
        if img[i,j,R] %2 != 0:
            img[i,j,R] = img[i,j,R]+1 if img[i,j,R] <2 else img[i,j,R]-1

step2:在意個白色的圖片上寫上黑色的文字[同樣是bmp]

step3:通過讀取寫有隱藏信息的圖片的像素值,將載體圖片同等坐標的R像素值改成奇數

for i in range(w):
    for j in range(h):
        if code[i,j,R] == 0 and code[i,j,G] == 0 and code[i,j,B] == 0:
            img[i,j,R] += 1

解碼:

遍歷有隱藏信息的圖片,尋找R值為奇數的坐標;在空白圖片對應的坐標設置一種顏色

for i in range(w):
    for j in range(h):
        if img[i,j,R] %2 != 0:
            out[i,j,R]=255
            out[i,j,G]=255
            out[i,j,B]=255

完整的代碼(Python+OpenCV2,其實就是用了一下讀取、更改像素的功能)

隱藏信息:

#coding:utf-8
import cv2
import numpy as np
# import random
img = cv2.imread("lena.bmp")
code = cv2.imread("code.bmp")
w,h = img.shape[:2]
# print w,h
for i in range(w):
    for j in range(h):
        if img[i,j,2] %2 != 0:
            img[i,j,2] = img[i,j,2]+1 if img[i,j,2] <2 else img[i,j,2]-1
# cv2.imwrite("quanou.bmp",img)
for i in range(w):
    for j in range(h):
        if code[i,j,0] == 0 and code[i,j,1] == 0 and code[i,j,2] == 0:
            img[i,j,2] += 1
cv2.imwrite("final.bmp",img)

提取信息:

#coding:utf-8
import cv2
import numpy as np
img = cv2.imread("final.bmp")
out = np.zeros(img.shape,np.uint8)
w,h = img.shape[:2]
for i in range(w):
    for j in range(h):
        if img[i,j,2] %2 != 0:
            out[i,j,0]=255
            out[i,j,1]=255
            out[i,j,2]=255
cv2.imwrite("out.bmp",out)


免責聲明!

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



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