2. 使用像素替代算法,将自己的学号 SID.bmp(16×16)以可见水印形式随机位置嵌入 lena.map(128×128)。
时间: 2024-03-14 19:45:45 浏览: 222
这是一个关于数字水印嵌入的问题。数字水印是一种隐蔽信息的方式,可以将一些特定的标识嵌入到数字图像中,不影响图像的质量和观感,但可以在需要时提供图像的真实信息。在这个问题中,我们将使用像素替代算法来将学号嵌入到lena图像中。
具体步骤如下:
1. 加载SID.bmp和lena.map两个图像,并获得它们的像素矩阵。
2. 对SID.bmp进行像素替代算法的嵌入操作,即将每个像素的二进制码的第一位替换为学号的二进制码。
3. 将嵌入后的SID.bmp图像以可见水印形式嵌入到lena.map图像中,即在lena.map的随机位置,将16×16的SID.bmp图像直接拷贝过来即可。
4. 输出嵌入后的lena.map图像,并保存到本地。
需要注意的是,嵌入操作需要保证嵌入后的图像能够被提取出来。因此,在嵌入操作完成后,需要对图像进行提取操作,即将每个像素的二进制码的第一位提取出来,得到学号的二进制码,再将其转换为十进制数字即可。
具体代码实现可以参考以下步骤:
1. 加载图像并获取像素矩阵
```python
from PIL import Image
import numpy as np
# 加载SID.bmp和lena.map两个图像
sid_img = Image.open('SID.bmp')
lena_img = Image.open('lena.map')
# 获得像素矩阵
sid_pixels = np.array(sid_img)
lena_pixels = np.array(lena_img)
```
2. 像素替代算法的嵌入操作
```python
# 将学号的二进制码转换为字符串,并将每个字符转换为8位二进制码
sid_bin = ''.join(format(ord(c), '08b') for c in '202162203')
# 对SID.bmp进行像素替代算法的嵌入操作
for i in range(sid_pixels.shape[0]):
for j in range(sid_pixels.shape[1]):
# 获取像素的二进制码
pixel_bin = format(sid_pixels[i][j], '08b')
# 将学号的二进制码的第一位替换为像素的二进制码的第一位
pixel_bin = pixel_bin[:1] + sid_bin[(i*16+j)*8] + pixel_bin[2:]
# 将修改后的像素值赋回原像素矩阵
sid_pixels[i][j] = int(pixel_bin, 2)
```
3. 将嵌入后的SID.bmp图像以可见水印形式嵌入到lena.map图像中
```python
# 在lena.map的随机位置,将16×16的SID.bmp图像直接拷贝过来
x = np.random.randint(0, lena_pixels.shape[0]-16)
y = np.random.randint(0, lena_pixels.shape[1]-16)
lena_pixels[x:x+16, y:y+16] = sid_pixels
```
4. 输出嵌入后的lena.map图像,并保存到本地
```python
# 将像素矩阵转换为图像并保存到本地
result_img = Image.fromarray(lena_pixels)
result_img.save('result.bmp')
```
完成以上步骤后,可以得到嵌入了学号的lena.map图像,并且可以通过提取操作将学号提取出来。
阅读全文