数字水印里面的攻击实验NC值用Python代码怎么实现
时间: 2024-02-28 13:54:52 浏览: 29
数字水印的攻击实验中,NC(Normalized Correlation)是一种常用的度量水印提取质量的指标。下面是使用Python实现计算NC值的代码示例:
```python
import numpy as np
# 假设原始图像为x,水印图像为w,提取出来的水印为w',则计算NC值的代码如下:
def calc_nc(x, w, wp):
x = x.flatten() # 将x转换为一维向量
w = w.flatten() # 将w转换为一维向量
wp = wp.flatten() # 将wp转换为一维向量
nc = np.dot(w, wp) / (np.linalg.norm(w) * np.linalg.norm(wp)) # 计算NC值
return nc
# 示例:假设x、w、wp分别为以下矩阵
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
w = np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]])
wp = np.array([[1, 0, 1], [0, 1, 0], [0, 0, 0]])
# 计算NC值
nc = calc_nc(x, w, wp)
print(nc)
```
其中,x、w、wp分别为原始图像、水印图像和提取出来的水印图像,这里为了简化代码,将它们都表示为二维矩阵的形式。计算NC值的方法是先将x、w、wp转换为一维向量,然后使用公式计算。最后输出NC值。
相关问题
python计算水印提取的nc值
计算水印提取的NC(Normalized Correlation)值,可以使用Python中的NumPy库和scikit-image库。以下是一个简单的示例代码:
```python
import numpy as np
from skimage import io, color
from scipy.signal import correlate2d
# 读取原始图像和水印图像
img = io.imread('original_image.png')
watermark = io.imread('watermark.png')
# 将图像转换为灰度图像
img_gray = color.rgb2gray(img)
watermark_gray = color.rgb2gray(watermark)
# 计算水印提取的NC值
correlation = correlate2d(img_gray, watermark_gray)
nc_value = np.max(correlation)
print("NC value:", nc_value)
```
在上面的代码中,我们首先使用`skimage`库中的`io`模块读取原始图像和水印图像,并将它们转换为灰度图像。然后,我们使用`scipy`库中的`correlate2d`函数对两幅图像进行相关运算,得到一个相关矩阵。最后,我们计算相关矩阵中的最大值作为水印提取的NC值。
请注意,这只是一个简单的示例代码,实际应用中还需要进行更多的处理和优化。
python实现dct数字水印
数字水印可以通过将加密后的信息嵌入到图像的高频分量中来实现。其中,DCT(离散余弦变换)是一种常用的数字图像处理方法,可以将信号从时域转换到频域,进而提取图像的高频分量。下面是一个简单的Python代码示例,演示了如何使用DCT实现数字水印的嵌入和提取。
```python
import cv2
import numpy as np
# 加载图像
img = cv2.imread('lena.png', 0)
rows, cols = img.shape
# 生成随机二进制序列
message = '1010101010101010'
message_bits = np.array(list(message)).astype(int)
# 将二进制序列转换为DCT系数
message_dct = cv2.dct(np.float32(message_bits.reshape(4, 4)))
# 对图像进行DCT变换
dct = cv2.dct(np.float32(img))
# 将DCT系数嵌入到高频分量中
alpha = 0.1
dct[rows-4:rows, cols-4:cols] += alpha * message_dct
# 对图像进行IDCT变换
watermarked = cv2.idct(dct)
# 提取数字水印
extracted_dct = cv2.dct(np.float32(watermarked))
extracted_message = np.round(extracted_dct[rows-4:rows, cols-4:cols] * (1/alpha)).astype(int)
extracted_bits = np.ravel(extracted_message) % 2
# 输出结果
print('原始信息:', message_bits)
print('提取信息:', extracted_bits)
```
在这个示例中,我们首先加载了一张图像,并生成了一个长度为16的随机二进制序列。然后,我们将这个序列通过DCT变换转换为一组DCT系数,并将其嵌入到图像的右下角4x4的DCT系数中。这里,我们将嵌入系数的权值设置为0.1。最后,我们对加入数字水印的图像进行IDCT变换,提取出嵌入的数字水印,并对比原始信息和提取信息,以验证数字水印的正确性。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)