Python+OpenCV 实现图像位平面分层进行图像信息隐藏

news2025/1/8 3:39:33

引言

 闲言:这篇博客回归了传统图像处理领域,主要是在研究生的数字图像处理课程上接触到了新的知识–图像位平面,觉得还挺有意思的,可以用来做信息隐藏,索性记录一下。因为拖延的缘故,到学期末才赶出来一篇,后续可能还会有一篇消除图像摩尔纹的trick介绍(如果效果好的话)。
 本文的主题是介绍图像位平面相关知识,并依据不同位平面包含信息量的多寡设计了一种图像信息隐藏的算法,实际就是位平面的叠加,可以适用于图片加水印等场景。

图像位平面

 首先对图像的位平面进行介绍,众所周知,图像在计算机中存储方式为二维矩阵,矩阵的每一个元素都代表对应位置处像素点的亮度值,通常用uint8来表示,取值范围为0~255。换而言之,每个像素点都是一个8位二进制数,那么如果我们将每个像素点的一位抽取出来就可构造一个对应原图大小的为片面,其元素取值变为了0~1。举例而言,假设有一2*2的图像,其灰度值为: [ [ 1 , 2 ] , [ 3 , 4 ] ] [[1,2],\\ [3,4]] [[1,2],[3,4]]
那么其最低位位平面就为: [ [ 1 , 0 ] , [ 1 , 0 ] ] [[1,0],\\ [1,0]] [[1,0],[1,0]]
 值得注意的是,不同位片面的取值范围虽然相同,但其所包含的信息量是不同的(或者说权重),这是因为在构成图像时,它们要乘以对应二进制位数的权重,而位数越高从0变换至1或者从1变化至0给图像带来的影响越剧烈,位数越高保留的图像信息越整体,反之则越细节。对比如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
那么利用这一性质,我们就可以把用隐藏图片的最高位平面替换载体图片的最低位片面来达到隐藏信息,或者给图片加水印的目的。

代码

 代码上实现还是比较简单的,通过与运算提取出待隐藏图片的最高位平面,将其信息移动到要插入的位平面;然后去除载体图片对应的位平面,并进行替换即完成了隐藏部分。复原部分就只是前一阶段的逆过程,整体如下所示


import cv2
import warnings
import numpy as np
import matplotlib.pyplot as plt

def InfoHidden(carry_img,info_img,bit_plane):
    """
    carry_img: 作为载体的图片
    info_img: 作为隐藏信息的图片
    bit_plane: 要进行信息替换的平面
    """
    assert bit_plane in range(0,8),"Invaied BitPlane"
    if carry_img.shape!=info_img.shape:
        warnings.warn("shape of the two images don't match")
        carry_img=cv2.resize(carry_img,(info_img.shape[1],info_img.shape[0]))
    # 抽取info_img信息量最大平面
    info_img=np.bitwise_and(info_img,np.left_shift(1,7))
    # 转为二进制
    info_img_bit=np.right_shift(info_img,(7-bit_plane))
    # 构造carry_img的蒙版
    mask=np.bitwise_not(np.left_shift(1,bit_plane))
    hidden_img=info_img_bit+np.bitwise_and(carry_img,mask)
    return  hidden_img

def InfoExtrac(hidden_img,bit_plane):
    # 提取位平面
    recoverd_img = np.bitwise_and(hidden_img, np.left_shift(1,bit_plane))
    # 提升到最高位恢复信息
    recoverd_img=np.left_shift(recoverd_img,(7-bit_plane))
    return recoverd_img
img_path1=r"D:\temp\pic1.jpg"
img_path2=r"D:\temp\pic2.jpg"
carry_img=plt.imread(img_path1)
info_img=plt.imread(img_path2)
hidden_img=InfoHidden(carry_img,info_img,1)
plt.imshow(hidden_img)
plt.show(block=True)
recovered_img=InfoExtrac(hidden_img,1)
plt.axis('off')
plt.title('recovered image')
plt.imshow(recovered_img)
plt.show(block=True)

结果展示

 待隐藏图片:
在这里插入图片描述
 载体图片
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到隐藏效果还是很不错的,只是因为用的图都是彩色图样,所以存在着差异,如果是灰度图,恢复效果会十分优秀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/688413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业论文内容参考|基于Android的旅游攻略APP的设计与实现

文章目录 导文摘要:前言:绪论:1. 课题背景:2. 国内外现状与趋势:3. 课题内容:相关技术与方法介绍:系统分析:系统设计:系统实现系统测试总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于Android的旅游攻略APP的设计与实现 摘要: 本文基于Android平台…

python单元测试框架Unittest详解

前言 我们今天来聊聊Python中的单元测试框架unittest,大家都知道在Python中比较热门的测试框架除了pytest就是unittest,我之前有讲过pytest所以今天想讲unittest。喜欢的可以点点关注哟。 Unittest详解 Unittest是Python内部自带的一个单元测试的模块&…

mysql——初步认识

数据库是什么? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库 说人话 就是 数据库是一个电子仓库,里面存了一些数据 我们要学习的mysql就是数据库中的一种,并且是一种关系型数据库,当然有…

ASEMI快恢复二极管MUR20100DCR的性能与应用

编辑-Z 本文主要介绍了MUR20100DCR二极管的性能与应用。我们将对MUR20100DCR二极管的基本性能、不同领域的应用和优势与不足进行分析。 1、MUR20100DCR二极管的基本性能 MUR20100DCR二极管是一种高性能的超快速二极管,具有高电压、高电流和低漏电流等特点。它采用…

基于Python所写的企业编码生成系统

点击以下链接获取源码资源: https://download.csdn.net/download/qq_64505944/87950401?spm1001.2014.3001.5503 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&…

那些曾经考过的turtle绘图题(11~15)

【编程实现绘图 -11】 利用random库和turtle库,在屏幕上绘制4个小雪花,雪花半径随机,坐标由列表points给出,雪花颜色为红色,效果如图所示 points = [[0,0], [50, 40], [70, 80], [-40, 30]] # 样例代码 from turtle import * # 导入turtle库 import random pensize(4) …

【深入探讨】区块链的历史与现状

发表时间:2023年5月18日 最近,BSV比特币协会在德克萨斯州奥斯汀举办了首届Unbound Perspectives Live Summit活动。本次活动采取非公开形式,大约有100人受邀参会。 与会者包括了Unbounded Capital公司的有限合伙人、知名风险投资和对冲基金经…

跳跃表详解

跳跃表[SkipList]是一种基于有序链表的扩展,简称跳表,其就是使用关键节点作为索引的一种数据结构 怎样能更快查找到一个【有序链表】的某一节点呢? 可以利用类似【索引】的思想,提取出【链表】中的【部分关键节点】 比如&#…

bean的实例化和初始化

Instantiation:表示实例化,对象还未生成 Initialization:表示初始化,对象已经生成 InstantiationAwareBeanPostProcessor继承自BeanPostProcessor,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所…

VS Code 安装

前端开发工具 VSCodeHBuildersublimeWebStorm VS Code 一、介绍 Visual Studio Code(简称 VS Code )是 Microsoft 于2015年4月发布的一款代码编辑器。VS Code 对前端代码有非常强大的支持,同时也其他编程语言(例如&#xff1a…

20年运维老兵,SRE领域大咖张观石揭秘FinOps体系实践方法

当前,降本增效成为各大互联网公司的重要方向,IT成本则占据了互联网成本的大头。随着IT资源成本花费越来越高,很多公司意识到掌握管控成本和优化成本的重要性。 如何有效的降本?如何做好成本的洞察管控?如何掌握资源成…

ECDH 算法

一、简介 ECDH全称是椭圆曲线迪菲-赫尔曼秘钥交换(Elliptic Curve Diffie–Hellman key Exchange),主要是用来在一个不安全的通道中建立起安全的共有加密资料,一般来说交换的都是私钥,这个密钥一般作为“对称加密”的…

STM32速成笔记—IWDG

文章目录 一、IWDG简介二、STM32的IWDG2.1 STM32的IWDG简介2.2 喂狗2.3 IWDG框图 三、IWDG配置步骤四、IWDG配置程序4.1 IWDG初始化程序4.2 喂狗 五、应用实例 一、IWDG简介 独立看门狗(Independent Watchdog, IWDG),什么是看门狗&#xff1…

【二叉树part06】| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录 🎈LeetCode654.最大二叉树 🎈LeetCode617.合并二叉树 🎈LeetCode700. 二叉搜索树中的搜索 🎈LeetCode98. 验证二叉搜索树 🎈LeetCode654.最大二叉树 链接:654.最大二叉树 给定一个不重复的整数数…

林客本地生活商城小程序开发

本地生活商城小程序的市场前景非常广阔。近年来,随着移动互联网技术的普及和人们消费观念的变化,越来越多的消费者开始通过手机进行线上购物。本地生活商城小程序恰好满足了用户对于便捷、快速、个性化购物体验的需求,具有以下优势&#xff1…

1752_使用Perl实现目录遍历

全部学习汇总: GreyZhang/speed_emacs: Try to make a new emacs configuration which is fast even on windows! (github.com) 关于Perl和Python的优劣我不去做什么分析,也不去发表什么深入的见解。我个人的学习过程是先Perl后Python再回到Perl。因为工…

【2023.6.26】记达梦数据库基于信创服务器麒麟OS报错与优化

一、场景描述 OS:银河麒麟V10(GUI)CPU:鲲鹏920达梦数据库:V8 (基于平台信创:麒麟V10、鲲鹏架构)金蝶中间件:V9 二、达梦数据库报错记录 报错1:(SWT:18564&…

基于Java削面快餐店点餐服务系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

cmd中输入npm install,回车——安装node modules依赖,出现报错的【解决方法】

目录 1.正常情况是: 2.当前问题: 3.解决方法: 当拿到一个前端项目的代码文件夹的时候,想要启动项目。 如果项目的代码文件夹里面没有node modules文件夹: 需要打开cmd,然后在里面输入 npm install (可…

c++初始化列表和静态成员

文章目录 一、初始化列表二、静态(static)成员 一、初始化列表 类对于成员变量的赋值有两种方式 函数体内赋值初始化列表 函数体内赋值就是直接在构造函数中赋值即可,而初始化列表它是较为特殊的一种方式! 初始化列表是在构造函数()之后以:开始,然后后…