前言
在前面博文講解位平面分解的時候,我們就提到過可以通過位平面分解的方式給圖像添加水印眨唬。而數(shù)值水印是圖片版權(quán)用到最多的加密方式。
通過在最低有效位的位平面分解圖中隱藏二值圖像信息好乐,具有極高的隱蔽性匾竿。所以,友情提示各位程序員蔚万,不要以為網(wǎng)上的圖像可以隨便用岭妖,現(xiàn)在的加密方式真是讓你防不勝防。就算你知道了添加數(shù)值誰水印的原理笛坦,恐怕也無法找到其哪個是秘密的信息区转。(尊重版權(quán),不要存在僥幸心理)
數(shù)字水印的處理過程
從位平面來看版扩,數(shù)字水印的處理過程分為如下幾步:
(1)嵌入過程:將載體圖像的第0個位平面替換為數(shù)字水印信息废离。
(2)提取過程:將載體圖像的最低有效位平面提取出來,得到數(shù)字水印信息礁芦。
代碼實現(xiàn)嵌入與提取數(shù)字水印
原理我們都清楚之后蜻韭,我們可以直接開始編寫代碼:
import cv2
import numpy as np
img = cv2.imread("4.jpg", 0)
watermark = cv2.imread("watermark.jpg", 0)
#因為水印圖像就是讓人不易察覺也不影響原圖像,所以要將水印非0位全部替換位最小值1
w = watermark[:, :] > 0
watermark[w] = 1
#嵌入水印
r, c = img.shape
#生成元素都是254的數(shù)組
img254=np.ones((r,c),dtype=np.uint8)*254
#獲取高7位平面
imgH7=cv2.bitwise_and(img,img254)
#將水印嵌入即可
water_img=cv2.bitwise_or(imgH7,watermark)
cv2.imshow("1",img)
cv2.imshow("2",watermark*255)
cv2.imshow("3",water_img)
#生成都是1的數(shù)組
img1=np.ones((r,c),dtype=np.uint8)
#提取水印
water_extract=cv2.bitwise_and(water_img,img1)
#將水印里面的1還原成255
w=water_extract[:,:]>0
water_extract[w]=255
cv2.imshow("4",water_extract)
cv2.waitKey()
cv2.destroyAllWindows()
前面我們介紹過柿扣,圖像的最低位平面就是00000001肖方,而其他7個位平面合并就是11111110,也就是254未状,所以我們創(chuàng)建了一個全部為254的數(shù)組俯画。通過它獲取高7個位平面,然后與數(shù)字水印圖合并即可司草。
同樣的艰垂,提取圖像中數(shù)字水印,我們只需要獲取最低有效位平面埋虹,然后將其1值猜憎,全部換成255,就可以顯示出原水印圖搔课。
運行之后胰柑,顯示的效果如下圖所示: