前言:
当前我们对“空域数字水印算法”都比较关注,看官们都需要剖析一些“空域数字水印算法”的相关资讯。那么小编同时在网上网罗了一些有关“空域数字水印算法””的相关知识,希望你们能喜欢,我们一起来了解一下吧!原理
正常水印添加是将2个图片的像素叠加即可.
数学公式表示为 f_w=(1-\alpha)f+\alpha wfw=(1−α)f+αw
其中\alphaα表示是背景与水印的可见性,取值为0到1.
当w为RGBA模式时,参与计算的\alphaα需要乘以水印的A通道与255的比值.
LSB 不可见水印
8bit表示的图像,最低位的图像信息对人眼感知几乎没有影响,因此可以将水印图像的高位信息插入到背景图片的低位信息上面.
数学公式表示 f_w=4(f\div4)+ w\div64fw=4(f÷4)+w÷64
上述公式将原图使用无符号整数除以 4 并乘以 4, 来置最低两个比特位为 0, 并用 64 除 , 将 的两个最高比特位移到衬底的最低比特位上.
代码实现
import osimport cv2 as cvimport numpy as np#原理# y=(f(x)/4)*4 +w/4# srcPath表示源图片路径# waterMarkPath表示水印路径# dstPath 表示加完水印后的照片路径def encode(srcPath,waterMarkPath,dstPath): srcImg=cv.imread(srcPath) waterMarkImg=cv.imread(waterMarkPath) print(srcImg.shape) print(waterMarkImg.shape) srcImg=srcImg.astype(np.uint8) #将源图片低2位置0 for x in range(waterMarkImg.shape[0]): for y in range(waterMarkImg.shape[1]): srcImg[x][y] =srcImg[x][y] & 0b11111100 #原图低2位置0 srcImg[x][y] += (waterMarkImg[x][y] >> 6) #水印右移6位,只保留高位 cv.imwrite(dstPath,srcImg)# srcPath 表示包含水印的图片路径# extractWaterMarkPath 表示提取的水印路径# 将高6位置0,将低2位左移6位,即得到水印def decode(srcPath,watextractWaterMarkPath): srcImg=cv.imread(srcPath) waterMarkImg=srcImg.copy().astype(np.uint8) for x in range(waterMarkImg.shape[0]): for y in range(waterMarkImg.shape[1]): waterMarkImg[x][y] =waterMarkImg[x][y] & 0b00000011 #高6位置0,保留低2位 waterMarkImg[x][y] =waterMarkImg[x][y] << 6 cv.imwrite(watextractWaterMarkPath,waterMarkImg)if __name__ == "__main__": basePath=r"/data/git/blog/code/imageProcess" srcPath=os.path.join(basePath,r"./input/src.jpeg") waterMarkPath=os.path.join(basePath,r"./input/logo.jpeg") dstPath=os.path.join(basePath,r"./output/dstWithWarterMark.jpeg") extractWaterMarkPath=os.path.join(basePath,r"./output/extractWaterMark.jpeg") encode(srcPath,waterMarkPath,dstPath) decode(dstPath,extractWaterMarkPath)效果
原图
水印
加水印后的图片
提取的水印
最近在学习图形图像相关,感兴趣的可以关注我.
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #空域数字水印算法