水印性能评估

水印性能的评估主要是检测现在的水印与原水印的相似程度,一个是可以直接通过人的肉眼识别,但是这种一般需要经验丰富的检测者,并且不同的检测者检测的结果往往是不同的,因此我们应该进行相关性测试来判断相似程度,主要是从鲁棒性的度量标准,其标准从两个方面来进行检测,一个是归一化相关系数,另一个是比特误码率。

1.  归一化相关系数是评价水印的质量及水印对图形的影响程度。

2. 比特误码率主要是指取出的比特率中错误的编码,与所有嵌入编码之中的比率。

一般而言,对水印系统的鲁棒性考虑中,如果只判断水印是否存在,则根据归一化相关数判断。如果水印信息可以提取的情况下,则一般使用比特误码率来判断鲁棒性。





。。。。。今天看的比较少。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于Python实现的自适应图像数字水印算法性能评估: ```python import cv2 import numpy as np import math # 定义图像块大小和水印长度 block_size = 8 watermark_len = 64 # 读入原始图像和水印 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() # 测试水印鲁棒性 img_test = cv2.imread('lena.png') img_test_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_test_blocks[i * blocks_w + j] = img_test[i * block_size:(i + 1) * block_size, j * block_size:(j + 1) * block_size] # 对每个图像块进行攻击 attack_types = ['resize', 'rotate', 'blur', 'noise'] for attack_type in attack_types: for i in range(blocks_num): block = img_test_blocks[i] # 对图像块进行攻击 if attack_type == 'resize': block = cv2.resize(block, (block_size + 2, block_size + 2)) block = block[1:-1, 1:-1] elif attack_type == 'rotate': angle = np.random.randint(0, 360) M = cv2.getRotationMatrix2D((block_size / 2, block_size / 2), angle, 1) block = cv2.warpAffine(block, M, (block_size, block_size)) elif attack_type == 'blur': block = cv2.GaussianBlur(block, (3, 3), 0) elif attack_type == 'noise': noise = np.random.randint(0, 50, size=(block_size, block_size, c)) block = block.astype(np.int16) + noise block[block < 0] = 0 block[block > 255] = 255 block = block.astype(np.uint8) # 进行DCT变换 block_dct = cv2.dct(block.astype(np.float32)) # 获取变换系数的均值和标准差 mean = np.mean(block_dct) std = np.std(block_dct) # 检测水印 count = 0 for pos in range(block_size * block_size - watermark_len): # 提取水印 block_dct_copy = block_dct.copy().reshape((-1,)) block_watermark = np.zeros(watermark_len, dtype=np.int32) for j in range(watermark_len): if block_dct_copy[pos + j] > mean: block_watermark[j] = 1 else: block_watermark[j] = 0 # 判断提取出的水印是否与原始水印相同 if np.array_equal(block_watermark, watermark): count += 1 # 计算检测正确率 accuracy = count / (block_size * block_size - watermark_len) print('Attack Type: {}, Accuracy: {:.2f}%'.format(attack_type, accuracy * 100)) # 测试水印容量 img_capacity = cv2.imread('lena.png') img_capacity_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_capacity_blocks[i * blocks_w + j] = img_capacity[i * block_size:(i + 1) * block_size, j * block_size:(j + 1) * block_size] # 对每个图像块嵌入不同长度的水印 watermark_lens = [16, 32, 64, 128] for watermark_len in watermark_lens: capacity = 0 for i in range(blocks_num): block = img_capacity_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[:watermark_len] - 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) # 计算水印容量 capacity += watermark_len / (block_size * block_size) print('Watermark Length: {}, Capacity: {:.2f}%'.format(watermark_len, capacity * 100)) # 测试水印透明性 img_transparency = cv2.imread('lena.png') img_transparency_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_transparency_blocks[i * blocks_w + j] = img_transparency[i * block_size:(i + 1) * block_size, j * block_size:(j + 1) * block_size] # 对每个图像块进行嵌入 for i in range(blocks_num): block = img_transparency_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值