1. 程式人生 > >【Python】簡單的圖片隱寫術

【Python】簡單的圖片隱寫術

圖片隱寫術,即在圖片裡非顯式地嵌入資訊,實現圖片隱寫有很多方法。

第一種方式(來自維基百科):


這裡寫圖片描述
這裡寫圖片描述

要從上圖中獲取下圖的資訊,只需要將上圖色彩空間中的每個二進位制數都只保留最後兩位(即相當於與3做按位與計算),再將亮度層乘以85即可。用matlab實現這個操作很簡單,程式碼如下所示:

test=imread('D:/tree.png');
for i=1:3
for j=1:200
for k=1:200
test(j,k,i)=bitand(test(j,k,i),3);
end
end
end
test=rgb2hsv(test);
for i=1:200
for j=1:200
test(i
,j,3)=test(i,j,3)*85; end end test=hsv2rgb(test); imshow(test)

要注意的是用imread讀入的圖片是RGB色彩空間上的,而要改變圖片的亮度屬性一般要在HSV空間上操作。一開始沒有意識到這點的我一直都在更改B層,還好奇為什麼總是顯示出一隻藍色的貓……

作業要求程式碼用python實現於是又寫了一遍,注意要實現以下程式碼要先安裝pillow和skimage庫,而skimage庫又需要很多支援庫,總之看著裝就是了……

from PIL import Image
from skimage import color
import numpy as
np import matplotlib.pyplot as plt import math img=np.array(Image.open('D:/tree.png'))#開啟影象並轉化為數字矩陣 rows,cols,dims=img.shape for i in range(0,dims): for j in range(0,rows): for k in range(0,cols): img[j,k,i]=img[j,k,i]&3 imghsv=Image.fromarray(img)#矩陣轉換為影象 imghsv=color.rgb2hsv(imghsv) imghsv=np.array(imghsv) for
i in range(0,rows): for j in range(0,cols): imghsv[i,j,2]=imghsv[i,j,2]*85 imgrgb=color.hsv2rgb(imghsv) plt.figure("after") plt.imshow(imgrgb) plt.axis('off') plt.show()

要注意的是用PIL直接讀入的圖片並不是以矩陣格式儲存的,因此要想方便對畫素進行操作,可以先把圖片轉換為矩陣形式。而在矩陣形式下我沒有找到便於從RGB顏色空間轉換到HSV顏色空間的方法,於是只好又將矩陣轉換回PIL的內部形式轉換完顏色空間再接著操作……

第二種方式:

要想將一個水印圖片加入到另一張圖片裡去,如果按照上面解碼過程的反推則應該要捨棄掉水印圖片的大多數資訊。如果單純地將水印圖片色彩空間中每一個二進位制數的八位的前六位都捨棄掉,那根本就看不出水印裡是個啥了(╯’ - ‘)╯︵ ┻━┻

於是我想到的辦法和 @雨諾寒雪 一樣,乾脆把八位的二進位制數分成四塊,每塊分別加入到載體圖片上去,這樣能夠保證當載體圖片的長寬分別為水印圖片的長寬的兩倍的時候,水印圖片的資訊不會丟失。不過載體圖片還是略有損傷,這點好像是不可避免的……?

上圖是載體圖片,下圖是水印圖片,圖片來自網路。

![這裡寫圖片描述](https://img-blog.csdn.net/20171026165301038?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGFuZ29fbWlyYWNsZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這裡寫圖片描述](https://img-blog.csdn.net/20171026165330205?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGFuZ29fbWlyYWNsZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 依舊是先上matlab程式碼: **新增水印部分:**
mark=imread('D:/mark.png');
image=imread('D:/image.png');
for i=1:3
for j=1:600
for k=1:600
image(j,k,i)=bitand(image(j,k,i),252);
end
end
end
for i=1:3
for j=1:300
for k=1:300
image(2*j-1,2*k-1,i)=image(2*j-1,2*k-1,i)+bitand(mark(j,k,i),192)/64;
image(2*j-1,2*k,i)=image(2*j-1,2*k,i)+bitand(mark(j,k,i),48)/16;
image(2*j,2*k-1,i)=image(2*j,2*k-1,i)+bitand(mark(j,k,i),12)/4;
image(2*j,2*k,i)=image(2*j,2*k,i)+bitand(mark(j,k,i),3);
end
end
end

提取水印部分:

#前部分同上,省略
result=uint8(zeros(300,300,3));
for i=1:3
for j=1:600
for k=1:600
image(j,k,i)=bitand(image(j,k,i),3);
end
end
end
for i=1:3
for j=1:300
for k=1:300
result(j,k,i)=image(2*j-1,2*k-1,i)*64+image(2*j-1,2*k,i)*16+image(2*j,2*k-1,i)*4+image(2*j,2*k,i);
end
end
end
imshow(result)

同樣按照作業要求,再用python寫一遍:

新增水印部分:

from PIL import Image
from skimage import color
import numpy as np
import matplotlib.pyplot as plt
import math
img=np.array(Image.open('D:/image.png'))
mark=np.array(Image.open('D:/mark.png'))
rows,cols,dims=mark.shape
for i in range(0,dims):
    for j in range(0,rows*2):
        for k in range(0,cols*2):
            img[j,k,i]=img[j,k,i]&252
for i in range(0,dims):
    for j in range(0,rows):
        for k in range(0,cols):
            img[2*j,2*k,i]=img[2*j,2*k,i]+(mark[j,k,i]&192)//64
            img[2*j,2*k+1,i]=img[2*j,2*k+1,i]+(mark[j,k,i]&48)//16
            img[2*j+1,2*k,i]=img[2*j+1,2*k,i]+(mark[j,k,i]&12)//4
            img[2*j+1,2*k+1,i]=img[2*j+1,2*k+1,i]+(mark[j,k,i]&3)
img=Image.fromarray(img)
img.save('D:/image_with_mark.png')

提取水印部分:

from PIL import Image
from skimage import color
import numpy as np
import matplotlib.pyplot as plt
import math
imgwmark=np.array(Image.open('D:/image_with_mark.png'))
result=imgwmark
rows,cols,dims=imgwmark.shape
rows=rows//2
cols=cols//2
for i in range(0,dims):
    for j in range(0,rows*2):
        for k in range(0,cols*2):
           imgwmark[j,k,i]=imgwmark[j,k,i]&3
for i in range(0,dims):
    for j in range(0,rows):
        for k in range(0,cols):
            result[j,k,i]=imgwmark[2*j,2*k,i]*64+imgwmark[2*j,2*k+1,i]*16
            +imgwmark[2*j+1,2*k,i]*4+imgwmark[2*j+1,2*k+1,i]
mark_get=Image.fromarray(result)
mark_get.save('D:/mark_get.png')

要注意的是,我使用的是python3,在python3中除法(/)的結果預設是float型別的,因此使用向下取整(//)來強制將結果變回整數。

相關推薦

簡單圖片破解

這是百度杯上的一個小測試題,首先點選訪問看到圖片         一看名字就猜到應該是包含了壓縮包,但是我們還是用工具看看,儲存圖片放到kali中,在終端切換到圖片所在目錄用binwalk檢視,執行

Python簡單圖片

圖片隱寫術,即在圖片裡非顯式地嵌入資訊,實現圖片隱寫有很多方法。 第一種方式(來自維基百科): 要從上圖中獲取下圖的資訊,只需要將上圖色彩空間中的每個二進位制數都只保留最後兩位(即相當於與3做按位與計算),再將亮度層乘以85即可。用matla

圖片總結

後綴 一起 跳過 coo txt cool rem 分離 關於 一直比較喜歡做雜項(雖然還是很垃圾),就感覺很有意思。總結了一些關於圖片隱寫的姿勢,一起學習~ 1.另存為圖片 (還有直接看文件信息,可能就在文件信息裏面)2.改後綴 zip / rar /txt3.扔win

Python文件讀操作

class 控制臺 路徑 數據 編碼 data- ack dev dsm Python的文件讀寫有點類似php的文件讀寫。php的文件讀寫已經在《【php】讓記事本成為你調控變量的控制臺》(點擊打開鏈接)說過了,以下用一個小樣例說明Python的文件讀

前端的圖片

.com 前端 phy blog logs log 解答 images image 最近同事告訴了一個叫千裏碼的網站,進去看了一下,感覺很不錯,覆蓋面挺廣,題目也很有意思,也附帶了相關的學習素材。 裏面有一題隱寫術的 http://www.qlcoder.com/

python簡單的購物車

python#!/usr/bin/env python #-*- coding:utf-8 -*- #簡單的購物車 #知識點: #1:優雅的enumerate函數,返回一個生成器對象:(index,item)的元組 #2:print(‘product list :’.center(50,’-‘)) 可以居中

Python從0開始爬蟲——開發環境

stdin charm ready indicate importlib mirror upgrade war change      python小白,稍微看了點語法而已, 連字典的切片都永不順的那種。本身是寫java的,其實java也寫得菜, 每天下了班不是太想寫ja

Python從0開始爬蟲——扒狗東先流產了

https 數據 圖片 rip 取數據 很好 strip use str 上回寫到一半臨時有事,竟然沒有保存到!!!。這幾天也是因為家人過來玩。。我也不知道寫到哪兒了。我發現狗東這個奸賊很多數據是請求請求再請求,然後才拿到我們看到的數據顯示上去的。我嘗試了一下找齊這個數據確

Python從0開始爬蟲——豆瓣電影

for tag pes wing 信息 kit headers 自動 動畫 1. 最近略忙。。java在搞soap,之前是用工具自動生成代碼的。最近可能會寫一個soap的java調用 2. 這個豆瓣電影的爬蟲。扒信息的部分暫時先做到這了。扒到的信息如下 from s

python圖片合併PDF

python 多圖片合併pdf 起因 一個做美工的朋友需要將多個圖片jpg 、png 合併起來,PS操作太慢了所以用了python進行完成這個任務 程式碼 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Fi

圖片中隱藏資訊——圖片

https://www.jianshu.com/p/72f0d0953ca4 主要原理: 圖片是由一個個畫素組成的。每個畫素由一組(r,g,b)值表示(png格式圖片,多一個alpha透明度值)。而對於單個r,g或b,其範圍在0~255之間,可由一個位元組(8位表示)。因此,當改變最低位的值

圖片(利用圖片隱藏壓縮檔案)

    想象一個場景,下載了一個看似普通的圖片,然後修改一下字尾名為rar再解壓就發現隱藏於其中的檔案     如何將一個壓縮檔案隱藏於圖片之中呢,先來看看圖片和壓縮檔案的結構,我們都知道檔案在計算機裡都是以二進位制的形式存在的,所以

Python簡單的UDP通訊介面

(一)建立介面 wxFronBuilder使用方法,在TCP通訊詳細介紹過,大致如圖: 建立完成,選中專案->code選擇Python儲存->點選F8獲得 noname.py noname.py 部分截圖: (二)建立UdpChat專案 eclipse建立udp

Python簡單地理解Python中的if __name__ == '__main__'

轉載一篇寫的非常好的部落格 原文地址: 以下為原文 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')

Python 簡單網路爬蟲實現

引言 網路爬蟲(英語:web crawler),也叫網路蜘蛛(spider),是一種用來自動瀏覽全球資訊網的網路機器人。其目的一般為編纂網路索引。 --維基百科 網路爬蟲可以將自己所訪問的頁面儲存下來,以便搜尋引擎事後生成索引供使用者搜尋。 一般有兩個步驟:1.獲取網頁內

python根據圖片連結(地址)抓取圖片

參考:https://bbs.csdn.net/topics/391929530成功了import urllib urllib.urlretrieve('圖片連結http://', 'f:/自己的本地地址.jpg')

Python簡單的串列埠收發資料

實現效果: Python端執行的時候開啟COM3,然後準備從鍵盤獲取資料,併發送,同時接收串列埠除錯助手COM1傳送過來的資料 Python端: 串列埠除錯助手: 串列埠除錯助手使用COM1,能顯示Python端發過來的資料,當點擊發送的時候,Python端

Python 比較圖片相似度

# Filename: histsimilar.py # -*- coding: utf-8 -*-   import Image   def make_regalur_image(img, size = (256, 256)):     return img.resize

python簡單實現一個模板引擎

# simpletemplate 簡單的前端html編譯程式 有時候,我們就是簡單的做幾個前端頁面,頁面難免會出現重複的地方,比如head和footer nav導航,這個時候,我們修改一處,其它 地方也要修改,真心麻煩. 不過話說說回來,各種服務端程式語言都有比較成熟的模板程式,比如php的smarty

python圖片驗證碼的登入自動化實戰

近期在跟進新專案的時候,整體的業務線非常之長,會一直重複登入退出不同賬號的這個流程,所以想從登入開始實現部分的自動化。因為是B/S的架構,所以採用的是selenium的框架來實現。大致實現步驟如下:   1.環境準備   2.驗證碼爬取   3.識別方案選擇   4.影象處理和識別   5.自動化實現 一、