LSB图像水印法 python
时间: 2023-10-24 18:06:22 浏览: 122
LSB(Least Significant Bit)图像水印法是一种基于比特替换的图像水印技术,可以将一张水印图片嵌入到原始图像中,以达到保护版权、鉴别真伪等目的。下面是一个简单的 LSB 图像水印法的 Python 实现。
首先,我们需要安装 Pillow 库,它是 Python 的一个图像处理库,可以方便地进行图像读取、处理和保存等操作。在命令行中输入以下命令安装 Pillow:
```
pip install Pillow
```
然后,我们定义一个函数 `encode_lsb()`,用于将水印图像嵌入到原始图像中。其中,参数 `src_path` 和 `watermark_path` 分别表示原始图像和水印图像的路径,参数 `dst_path` 表示输出的带水印的图像的路径:
```python
from PIL import Image
def encode_lsb(src_path, watermark_path, dst_path):
# 加载原始图像和水印图像
src_img = Image.open(src_path).convert('RGBA')
watermark_img = Image.open(watermark_path).convert('RGBA')
# 将水印图像缩放为原始图像的大小
watermark_img = watermark_img.resize(src_img.size, Image.ANTIALIAS)
# 将水印图像转换为灰度图像,并获取它的像素值矩阵
watermark_data = watermark_img.convert('L').getdata()
# 获取原始图像的像素值矩阵
src_data = list(src_img.getdata())
# 将水印图像的像素值嵌入到原始图像中
for i in range(len(src_data)):
r, g, b, a = src_data[i]
if i < len(watermark_data):
watermark_bit = watermark_data[i] & 1 # 获取水印像素的最低位
if watermark_bit == 1:
r |= 1 # 将原始像素的红色通道的最低位替换为1
else:
r &= ~1 # 将原始像素的红色通道的最低位替换为0
src_data[i] = (r, g, b, a)
# 保存带水印的图像
dst_img = Image.new('RGBA', src_img.size)
dst_img.putdata(src_data)
dst_img.save(dst_path)
```
接下来,我们定义一个函数 `decode_lsb()`,用于从带水印的图像中提取出水印图像。其中,参数 `src_path` 表示带水印的图像的路径,参数 `dst_path` 表示输出的水印图像的路径:
```python
def decode_lsb(src_path, dst_path):
# 加载带水印的图像
src_img = Image.open(src_path).convert('RGBA')
# 获取带水印的图像的像素值矩阵
src_data = list(src_img.getdata())
# 从带水印的图像中提取水印图像的像素值
watermark_data = []
for i in range(len(src_data)):
r, g, b, a = src_data[i]
watermark_bit = r & 1 # 获取原始像素的红色通道的最低位
watermark_data.append(watermark_bit * 255) # 将最低位转换为像素值
# 保存水印图像
watermark_img = Image.new('L', src_img.size)
watermark_img.putdata(watermark_data)
watermark_img.save(dst_path)
```
最后,我们可以调用这两个函数来进行 LSB 图像水印的嵌入和提取操作:
```python
# 将水印图像嵌入到原始图像中
encode_lsb('原始图像路径', '水印图像路径', '输出图像路径')
# 从带水印的图像中提取水印图像
decode_lsb('带水印的图像路径', '输出图像路径')
```
需要注意的是,LSB 图像水印法是一种比较简单的图像水印技术,容易被攻击和破解。在实际应用中,需要考虑到安全性和鲁棒性等因素,并结合其他技术进行综合保护。
阅读全文