自适应的图像数字水印算法Python

时间: 2023-12-01 07:17:04 浏览: 43
以下是一个基于Python的自适应图像数字水印算法的示例代码: ```python import cv2 import numpy as np # 定义图像块大小和水印长度 block_size = 8 watermark_len = 32 # 读入原始图像和水印 img = cv2.imread('lena.png') watermark = np.random.randint(0, 2, watermark_len) # 对原始图像进行分块 h, w, c = img.shape blocks_h = h // block_size blocks_w = w // block_size blocks_num = blocks_h * blocks_w img_blocks = np.zeros((blocks_num, block_size, block_size, c), dtype=np.uint8) for i in range(blocks_h): for j in range(blocks_w): img_blocks[i * blocks_w + j] = img[i * block_size:(i + 1) * block_size, j * block_size:(j + 1) * block_size] # 对每个图像块进行变换和嵌入 for i in range(blocks_num): block = img_blocks[i].astype(np.float32) # 进行DCT变换 block_dct = cv2.dct(block) # 获取变换系数的均值和标准差 mean = np.mean(block_dct) std = np.std(block_dct) # 确定最佳嵌入位置 max_psnr = 0 best_pos = 0 for pos in range(block_size * block_size - watermark_len): # 嵌入水印 block_dct_copy = block_dct.copy().reshape((-1,)) block_dct_copy[pos:pos + watermark_len] += (2 * watermark - 1) * std block_dct_copy[block_dct_copy < mean] = mean block_dct_copy[block_dct_copy > 255] = 255 # 反变换得到水印图像块 block_watermark = cv2.idct(block_dct_copy.reshape((block_size, block_size))) block_watermark = np.round(block_watermark).astype(np.uint8) # 计算PSNR psnr = cv2.PSNR(block, block_watermark) if psnr > max_psnr: max_psnr = psnr best_pos = pos # 嵌入水印 block_dct_copy = block_dct.copy().reshape((-1,)) block_dct_copy[best_pos:best_pos + watermark_len] += (2 * watermark - 1) * std block_dct_copy[block_dct_copy < mean] = mean block_dct_copy[block_dct_copy > 255] = 255 # 反变换得到含有水印的图像块 img_blocks[i] = cv2.idct(block_dct_copy.reshape((block_size, block_size))).astype(np.uint8) # 合并图像块得到含有水印的图像 img_watermark = np.zeros((h, w, c), dtype=np.uint8) for i in range(blocks_h): for j in range(blocks_w): img_watermark[i * block_size:(i + 1) * block_size, j * block_size:(j + 1) * block_size] = img_blocks[i * blocks_w + j] # 显示原始图像和含水印的图像 cv2.imshow('Original Image', img) cv2.imshow('Watermarked Image', img_watermark) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这个示例代码实现了一个简单的自适应图像数字水印算法,对每个图像块进行DCT变换,并根据变换系数的均值和标准差确定最佳嵌入位置。水印嵌入过程中使用了随机的二进制水印,并且只嵌入了32个比特。在实际应用中,可以根据需要调整水印长度和嵌入位置的确定方法。

相关推荐

最新推荐

recommend-type

灰度图像水印的自适应二维数字水印算法

随着数字化技术的成熟,越来越多的数字作品 通过 Internet 进行传播,它可以低成本、高速度地 被复制和传播,但这些特性也容易被盗版者所利 用,现在世界上每年因利用计算机网络进行犯罪所 造成的直接经济损失令人...
recommend-type

HDR图像色调映射的自适应色彩调节算法

为了克服传统色调映射算法处理高动态图像过程中因忽略彩色分量而导致图像色彩失真的现象,给出一种自适应的色彩调节算法。该方法首先对图像在亮度域采用色调映射压缩处理,然后再转换到色彩域,采用色彩恢复和色彩...
recommend-type

10自适应旁瓣对消算法仿真分析

这时学校的专业综合大课设,属于对论文的深化的过程,参见了文中的文献和自己写的代码,得到的仿真,取得了一定的效果,可以对以后的课程设计有一定的启发作用!
recommend-type

px4-L1自适应控制算法.pdf

本文首先理清了l1 自适应算法的思路,然后,根据算法的实现步骤,对apm 自适应算法的实现做了细致的分析,读者可以加强对apm代码的了解
recommend-type

基于自适应算法的数字水印

数字水印生成是数字水印处理过程的第一步,也是非常专业的一步。一个好的水印生成系统对最终含水印图像的鲁棒性等属性有着至关重要的作用。而构成的水印的序列通常应该具有不可预测的随机性,并且由于人类视觉对纹理...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。