基于DCT算法的Python图片隐写术:嵌入与提取隐藏水印
基于DCT算法的Python图片隐写术:嵌入与提取隐藏水印
本教程将介绍如何使用Python和离散余弦变换(DCT)算法在图片中嵌入和提取隐藏水印。
1. 嵌入水印
以下Python代码演示了如何将文本水印嵌入到图片中:pythonimport cv2import numpy as np
def embed_watermark(original_image, watermark): # 读取原图像 img = cv2.imread(original_image)
# 将原图像转换为YCbCr颜色空间 ycbcr_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
# 将水印转换为二进制字符串 watermark_binary = ''.join(format(ord(char), '08b') for char in watermark)
# 获取图像的高度和宽度 height, width, _ = ycbcr_img.shape
# 将水印嵌入到图像的Y通道 for i in range(height): for j in range(width): # 获取当前像素的Y分量 y = ycbcr_img[i, j, 0]
# 获取当前像素的二进制表示 y_binary = format(y, '08b')
# 替换最低有效位为水印的二进制值 modified_y_binary = y_binary[:-1] + watermark_binary[(i * width + j) % len(watermark_binary)]
# 将修改后的二进制值转换为整数 modified_y = int(modified_y_binary, 2)
# 更新像素的Y分量 ycbcr_img[i, j, 0] = modified_y
# 将图像转换回BGR颜色空间 modified_img = cv2.cvtColor(ycbcr_img, cv2.COLOR_YCrCb2BGR)
# 返回嵌入水印后的图像 return modified_img
测试代码original_image = 'P.jpg'watermark = 'abc'modified_image = embed_watermark(original_image, watermark)
保存嵌入水印后的图像cv2.imwrite('SP.jpg', modified_image)
代码说明:
- 读取原始图像 (
P.jpg) 并将其转换为 YCbCr 颜色空间。2. 将水印文本转换为二进制字符串。3. 逐个像素遍历图像的 Y 通道。4. 将每个像素的最低有效位替换为水印的对应位。5. 将修改后的图像转换回 BGR 颜色空间并保存为SP.jpg。
2. 提取水印
以下代码演示了如何从嵌入水印的图像中提取隐藏的文本信息:pythonimport cv2import numpy as np
def extract_watermark(embedded_image): # 读取嵌入水印后的图像 img = cv2.imread(embedded_image)
# 将图像转换为YCbCr颜色空间 ycbcr_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
# 获取图像的高度和宽度 height, width, _ = ycbcr_img.shape
# 提取嵌入的水印 watermark_binary = '' for i in range(height): for j in range(width): # 获取当前像素的Y分量 y = ycbcr_img[i, j, 0]
# 获取当前像素的二进制表示 y_binary = format(y, '08b')
# 提取最低有效位作为水印的二进制值 watermark_binary += y_binary[-1]
# 将水印的二进制值转换为字符 watermark = ''.join(chr(int(watermark_binary[i:i+8], 2)) for i in range(0, len(watermark_binary), 8))
# 返回提取的水印 return watermark
测试代码embedded_image = 'SP.jpg'extracted_watermark = extract_watermark(embedded_image)
打印提取的水印print(extracted_watermar
原文地址: https://www.cveoy.top/t/topic/lakf 著作权归作者所有。请勿转载和采集!