import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from scipy.fftpack import dct, idct
# DCT嵌入和提取函数,不改变水印大小
def dct_embed_extract_fixed_size(watermark, host, start_x, start_y, alpha=0.05):
end_x, end_y = start_x + watermark.shape[0], start_y + watermark.shape[1]
region_host = host[start_y:end_y, start_x:end_x].astype(float)
watermark_float = watermark.astype(float)
# 应用二维DCT
dct_watermark = dct(dct(watermark_float.T, norm='ortho').T, norm='ortho')
dct_region_host = dct(dct(region_host.T, norm='ortho').T, norm='ortho')
# 嵌入水印
combined_dct = dct_region_host + alpha * dct_watermark
# 应用二维IDCT
modified_region = idct(idct(combined_dct.T, norm='ortho').T, norm='ortho')
host[start_y:end_y, start_x:end_x] = modified_region
# 提取水印
extracted_watermark = (modified_region - region_host) / alpha
return host, extracted_watermark
# 加载图像
logistic_img = Image.open("/path/to/your/Logistic.png").convert('L')
baboo_img = Image.open("/path/to/your/baboo256.BMP").convert('L')
# 转换为numpy数组
logistic_array = np.array(logistic_img)
baboo_array = np.array(baboo_img)
# 选择嵌入的起始位置,确保水印完全在宿主图像内
start_x, start_y = 50, 50 # 调整这些值以适应你的图像尺寸
modified_baboo, extracted_watermark = dct_embed_extract_fixed_size(logistic_array, baboo_array, start_x, start_y)
# 显示和保存图像
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(baboo_array, cmap='gray')
axs[0].set_title('Original Baboo Image')
axs[1].imshow(modified_baboo, cmap='gray')
axs[1].set_title('Modified Baboo Image')
axs[2].imshow(extracted_watermark, cmap='gray')
axs[2].set_title('Extracted Watermark Image')
for ax in axs:
ax.axis('off')
plt.show()
# 保存修改后的图像和提取的水印图像
modified_baboo_img = Image.fromarray(modified_baboo.astype(np.uint8))
extracted_watermark_img = Image.fromarray(extracted_watermark.astype(np.uint8))
modified_baboo_img.save("/path/to/save/modified_baboo.png")
extracted_watermark_img.save("/path/to/save/extracted_watermark.png")
dct草稿啊
最新推荐文章于 2024-07-03 22:28:26 发布