图像隐写(Image Steganography)

  • 引言
  • 空域隐写
  • 频域隐写
  • 调用python包隐写
  • 总结

引言

今天学习了图像隐写,图像隐写就是把信息隐藏写入到数字图像里面,一般情况下看不出有什么,需要去解析后才能获取隐藏的内容。然后自己写了下python代码实现下:1.从图像空域隐写信息;2.从图像频域隐写信息;3.用stegano包直接调用接口进行隐写。

空域隐写

显示器的标准格式就用(R,G,B)表示一个像素的颜色显示,其范围为黑色(0, 0, 0)~ 白色(255, 255, 255)。用每一个都是用8 bit的信息的表示,其中隐写的LSB(Least Significant Bits)算法就是用最后一个bit来写入信息而图像不至于失真太明显。

from PIL import Image, ImageDraw, ImageFont
import numpy as np
from matplotlib import pyplot as plt# 画一张跟原始图像一样大小的水印图像,把字符串用黑色微软雅黑14号大小循环画成水印图像
def draw_a_water_mark_img(img_size, img_mode, water_mark_str):image_draw = Image.new(img_mode, img_size,"white")draw = ImageDraw.Draw(image_draw)# 字体大小,用的是微软雅黑font_size = 14water_mark_size = len(water_mark_str)x_step_num = int(img_size[0] / font_size)y_step_num = int(img_size[1] / font_size)k = 0for j in range(y_step_num):for i in range(x_step_num):draw.text((i * font_size,j * font_size),water_mark_str[k%water_mark_size], font=ImageFont.truetype("msyh.ttc",font_size),fill="black")k=k+1return image_draw# 通过先右移再左移的移位操作使最后的1个bit为0,形成新的原始图像
def make_least_significant_bit_0(img):img_list = list(img.getdata())new_img_list = [(r >> 1 << 1, g >> 1 << 1, b >> 1 << 1) for [r, g, b] in img_list]new_img = Image.new(img.mode, img.size)new_img.putdata(new_img_list)    return new_img# 把水印图像设置到新的原始图像里
def set_msg_into_img_space(lsb_0_img, water_mark_img):lsb_0_enum = enumerate(list(lsb_0_img.getdata()))water_mark_list = list(water_mark_img.getdata())#(0, 0, 0)是黑色,(255, 255, 255)是白色,由于用笔画出来的并不一定都是黑色(阴影或者笔锋等造成),所以要用小于号二值化掉字体。有黑色字体的给最后一位加1,其他保持不变result = [(r, g, b) if (water_mark_list[index]<(255,255,255)) else (r|1, g|1, b|1) for index,(r, g, b) in lsb_0_enum]new_result = Image.new(lsb_0_img.mode, lsb_0_img.size)new_result.putdata(result)return new_result# 编码写入水印
def encode_img(img, water_mark_str):## 从空域上写入水印water_mark_img = draw_a_water_mark_img(img.size, img.mode, water_mark_str)lsb_0_img = make_least_significant_bit_0(img)encode_img = set_msg_into_img_space(lsb_0_img, water_mark_img) return encode_img# 从编码后的图像获取水印图像
def get_water_mark_from_img_space(img):img_enum = enumerate(list(img.getdata()))white_img = Image.new(img.mode, img.size, "white")decode_img_list = [(0,0,0) if (r&1==0 and g&1==0 and b&1==0) else (255,255,255) for index,[r, g, b] in img_enum]decode_img = Image.new(img.mode, img.size)decode_img.putdata(decode_img_list)return decode_imgimg = Image.open('lena.jpeg')
water_mark_str = "Copyright 2022 ***, All Rights Reserved."
encode_img = encode_img(img, water_mark_str)
decode_img = get_water_mark_from_img_space(encode_img)
encode_img.save("encode_space_img.png")
decode_img.save("decode_space_img.png")


频域隐写

把图像经过快速傅里叶变换后,再把高频部分移到图像中间,然后我们把水印图像写到高频的地方,如图像的左上角,因为高频地方的改变对图像的影响较小。然后再反傅里叶变换得到编码后的图像。

def set_msg_into_img_spectrum(img, water_mark_img):# 快速傅里叶变换f=np.fft.fft2(img)# 高频移至图像中间fshift = np.fft.fftshift(f)(wm_heigh, wm_width) = water_mark_img.size(img_width, img_heigh) = img.size# 水印图像不要大于原始图像的1/4if(wm_heigh > img_heigh/4 or wm_width > img_width/4):print("water_mark_img is not suitable")return#左上角添加水印fshift[0:wm_width,0:wm_heigh,:] = water_mark_img# 查看频谱信息# plt.imshow(np.abs(fshift).astype(np.uint8))# plt.show()# 傅里叶反变换ishift = np.fft.ifftshift(fshift)iimg = np.fft.ifft2(ishift)result = np.abs(iimg).astype(np.uint8)result_img = Image.fromarray(result)return result_imgdef get_water_mark_from_img_spectrum(img):f=np.fft.fft2(img)fshift = np.fft.fftshift(f)result = np.abs(fshift).astype(np.uint8)result_img = Image.fromarray(result)return result_imgdef encode_img(img, water_mark_str):## 从频域上写入水印(img_width, img_heigh) = img.sizewater_mark_img = draw_a_water_mark_img((int(img_width/4), int(img_heigh/4)), img.mode, water_mark_str)encode_img = set_msg_into_img_spectrum(img, water_mark_img)  return encode_img
encode_img = encode_img(img, water_mark_str)
decode_img = get_water_mark_from_img_spectrum(encode_img)
encode_img.save("encode_spectrum_img.png")
decode_img.save("decode_spectrum_img.png")



其实贴完图的频谱图像是下面这样的,后面经过一系列转化后,就变得上面的那样了。

调用python包隐写

from stegano import lsb
img = Image.open('lena.jpeg')
img_hide = lsb.hide(img, water_mark_str)
img_hide.save("img_hide.png")
open_img = Image.open("img_hide.png")
print(lsb.reveal(open_img))
Copyright 2022 ***, All Rights Reserved.

总结

你学废了吗?

数字图像 - 图像隐写相关推荐

  1. matlab图像隐写,matlab软件图像处理相关内容.ppt

    内容主要分为以下四个篇章: 一.介绍应用matlab处理图像问题 (以一个图像隐写的简单例子为说明线索) 二.应用matlab解决三维血管重建中的图像处理问题 三.图像处理练习(应用matlab解决双 ...

  2. Deep Learning Hierarchical Representations for Image Steganalysis【Ye-Net:图像隐写分析的深度学习层次表示】

    Deep Learning Hierarchical Representations for Image Steganalysis [Ye-Net:图像隐写分析的深度学习层次表示] Abstract ...

  3. 图像隐写,如何在图像中隐藏二维码

    一.前言 在某个App中有一个加密水印的功能,当帖子的主人开启了之后.如果有人截图,那么这张截图中就是添加截图用户.帖子ID.截图时间等信息,而且我们无法用肉眼看出这些水印. 这可以通过今天要介绍的隐 ...

  4. python图像隐写技术_图像隐写技术(Image Steganography)

    withopen( "input.jpg", "rb") asf: f_bytes = f.read print( f_bytes[: 2] ) print( ...

  5. 深度学习之图像隐写去除(DDSP模型 Steganography Removal)

    文章目录 一 前言 二 论文内容 2.1 Abstract 2.2 Introduction 2.3 Background 2.3.1 Prior Work 2.3.2 Super Resolutio ...

  6. python图片隐写_CTF 图像隐写Python脚本处理

    CTF中经常会遇到很多图片的隐写题目需要使用脚本来解题,最常用到的就是使用python中的PIL库,所以如果要更好的解出图片隐写相关处理的题目,掌握好这个库的使用是必要的.本期就来给大家介绍下这个库的 ...

  7. 【图像隐写】基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取含Matlab源码

    1 简介 基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取. 1.1 LSB算法 根据LSB算法简单易实现的特点,结合在图像置乱技术中很好特性的Arnold变换.利用变化产生影子图像.通过 ...

  8. Efficient feature learning and multi-size image steganalysis based on CNN【Zhu-Net基于高效特征学习与多尺度图像隐写分析】

    摘要 对于隐写分析,许多研究表明卷积神经网络比传统机器学习方法的两部分结构具有更好的性能.然而,仍然有两个问题需要解决:降低隐写分析特征映射的信噪比和对任意大小的图像进行隐写分析.一些算法需要固定大小 ...

  9. 图像隐写分析——生成含密图像 Stego Image

    文章目录 一 图像隐写分析的数据集 二 含密图像展示 三 结语 一 图像隐写分析的数据集   小编本科毕设的题目是<基于深度学习的图像隐写分析>,图像隐写分析问题本质上是一个二分类(bin ...

最新文章

  1. Ubuntu18.04 编译 ncnn
  2. 网易UI自动化测试探索:Airtest+Poco
  3. 微型计算机除具有计算机的一般特点外,10秋学期《计算机应用基础》第1次在线作业答案免费6/15...
  4. 华为读取版本exe_关于esrv_svc.exe和SurSvc.exe疑似泄露用户信息的猜测
  5. 网易严选宣布退出双11?
  6. 怎么爬before after之间的内容_关于伪元素::before和::after的用法
  7. (转)栈与堆栈的区别
  8. 键盘上所有键位的ascii值
  9. [Django]Windows下的Django安装——通过pip
  10. Hadoop安装详细教程 单机版
  11. 计算机应用 课件 .doc,计算机应用基础(计算机应用基础)课件.doc
  12. android 坐标度分秒转换工具,经纬度格式转换定位工具
  13. Mac下nginx配置虚拟主机,访问报错502
  14. 如何实现高效的室内定位和追踪?
  15. Arduino UNO+OLED可视化音乐频谱:32段分频0.96寸OLED显示细条频谱线
  16. ipad上怎么打开html文件,ipad HTML文件怎么打开
  17. CS224W-图神经网络 笔记5.2:Spectral Clustering - 谱聚类主要思想及关键结论的证明
  18. 鼠标悬停出现遮罩或图片放大效果
  19. 极路由 刷linux,记一次 极路由1S HC5661 TTL root 刷 U-BOOT 不死固件 及 爱快固件-20200320更新...
  20. 龙芯软件开发(6)--CPU龙芯2E

热门文章

  1. robomongo 连不上mongodb 权限问题
  2. Docker系列(二十三)——Docker实例五Docker安装MongoDB实例
  3. XSS攻击和CSRF攻击及其区别
  4. 8086汇编基础 debug mov al,'a'或者mov ax,'ab'错误的
  5. XSL的一些基础知识!
  6. c语言中整除和模除的优先级,整除运算与取模运算
  7. datalist图片九宫显示
  8. Docker——Tomcat部署
  9. 大机构里站队忙——北漂18年(22)
  10. 单向散列函数 (Hash)