当前位置: 首页 > news >正文

opencv-python之位平面分解与数字水印

位平面分解与数字水印

  • 位平面分解与数字水印
    • 位平面分解
      • 1.图像预处理
      • 2.构造提取矩阵
      • 3.位平面提取
      • 4.阈值处理
      • 5.显示图像
    • 简单的数字水印
      • 1.载体图像预处理
      • 2.水印图像处理
      • 3.水印添加
      • 4.水印提取

位平面分解与数字水印

两张素材:
在这里插入图片描述
在这里插入图片描述

位平面分解

图像矩阵中的每个值是一个八位二进制数,它可以表示为:
v a l u e = a 0 ⋅ 2 0 + a 1 ⋅ 2 1 + a 2 ⋅ 2 2 + a 3 ⋅ 2 3 + a 4 ⋅ 2 4 + a 5 ⋅ 2 5 + a 6 ⋅ 2 6 + a 7 ⋅ 2 7 a i = 0 / 1 value=a_0·2^0+a_1·2^1+a_2·2^2+a_3·2^3+a_4·2^4+a_5·2^5+a_6·2^6+a_7·2^7 \\ a_i=0/1 value=a020+a121+a222+a323+a424+a525+a626+a727ai=0/1
将整个矩阵的值的 a i ⋅ 2 i a_i·2^{i} ai2i 提取出来,得到新的8个矩阵,称这8个矩阵为图像的位平面。

可以通过按位与实现。

1.图像预处理

获取图像的形状

# 图像预处理
image = cv2.imread("./monalisa.png")
shape=image.shape

2.构造提取矩阵

2 i 2^i 2i作按位与运算,可以得到第i位的值

故需构造8个值全为 2 i 2^i 2i 的矩阵

# 构造提取矩阵
for i in range(8):
    bit_mat=np.ones(shape)*(2**i)

3.位平面提取

与提取矩阵分别进行按位与运算

	# 位平面提取
    result=cv2.bitwise_and(image,bit_mat)

4.阈值处理

为了让位平面更加清晰可见,将 2 i 2^i 2i 全都处理为255

	# 阈值处理
    for j in range(3):
        mask=result[:,:,j]>0
        result[mask]=255

5.显示图像

	# 显示图像
    cv2.namedWindow(f"bit {i}", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
    cv2.imshow(f"bit {i}",result)
import cv2
import numpy as np

# 图像预处理
image = cv2.imread("./monalisa.png")
shape = image.shape

# 构造提取矩阵
for i in range(8):
    bit_mat = np.ones(shape, dtype=np.uint8) * (2**i)

    # 位平面提取
    result = cv2.bitwise_and(image, bit_mat)

    # 阈值处理
    for j in range(3):
        mask = result[:, :, j] > 0
        result[mask] = 255

    # 显示图像
    cv2.namedWindow(f"bit {i}", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
    cv2.imshow(f"bit {i}", result)

# 关闭窗口
key = chr(cv2.waitKey())
if key == "1":
    print("图像显示结束")
    cv2.destroyAllWindows()

在这里插入图片描述

简单的数字水印

最低有效位指的是第0位。它影响整个图像的程度更低。我们可以把一些信息隐藏到最低有效位平面中。

可称之为数字水印。

1.载体图像预处理

将数字与11111110(十进制为254)作按位与,可以保留前7位,将第0位设置为0

image = cv2.imread("./monalisa.png")
bit_mat=np.ones(image.shape, dtype=np.uint8) * (254)
image=cv2.bitwise_and(image,bit_mat)

2.水印图像处理

将正值全部设置为1,方便嵌入载体图像的第0位

info=cv2.imread("./info.png")
for j in range(3):
        info_mask = info[:, :, j] > 0
        info[info_mask] = 1

3.水印添加

将处理完后的载体图像与水印图像作按位或运算,可以将水印图像嵌入载体图像的第0位

result1=cv2.bitwise_or(image,info)
cv2.namedWindow("in", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow("in",result1)

4.水印提取

用全1矩阵与添加完水印的图像作按位与运算,提取第0位,并扩大到255倍,方便显示水印图像

# 水印提取
bit_mat=np.ones(image.shape, dtype=np.uint8)
result2=cv2.bitwise_and(result1,bit_mat)*255
cv2.namedWindow("out", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow("out",result2)

import cv2
import numpy as np

# 载体图像预处理
image = cv2.imread("./monalisa.png")
bit_mat=np.ones(image.shape, dtype=np.uint8) * (254)
image=cv2.bitwise_and(image,bit_mat)

# 水印图像处理
info=cv2.imread("./info.png")
for j in range(3):
        info_mask = info[:, :, j] > 0
        info[info_mask] = 1

# 水印添加
result1=cv2.bitwise_or(image,info)
cv2.namedWindow("in", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow("in",result1)

# 水印提取
bit_mat=np.ones(image.shape, dtype=np.uint8)
result2=cv2.bitwise_and(result1,bit_mat)*255
cv2.namedWindow("out", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow("out",result2)

key = chr(cv2.waitKey())
if key == "1":
    print("图像显示结束")
    cv2.destroyAllWindows()

在这里插入图片描述

相关文章:

  • 技术分享 | 黑盒测试方法论—等价类
  • 医疗信息管理系统(HIS)——>业务介绍
  • 电脑截图怎么转换成文字?学会这个方法,轻松实现
  • 基于Redis手工实现分布式锁
  • 学历证书查询 易语言代码
  • ssm小型物流信息系统毕业设计源码071146
  • Windows使用命令查看端口号占用情况并关闭进程
  • Windows与网络基础-5-安装eNSP软件环境
  • solidworks动画制作教程——装配体爆炸动画
  • 青菜学艺往事
  • Java14-线程、同步
  • Unity中的序列化和反序列化
  • RocketMQ的架构设计
  • C++ 小游戏 视频及资料集(5)
  • k8s主节点与子节点的错误解决
  • 【css3】浏览器内核及其兼容性
  • 4. 路由到控制器 - Laravel从零开始教程
  • docker-consul
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java多线程(4):使用线程池执行定时任务
  • Laravel 菜鸟晋级之路
  • node学习系列之简单文件上传
  • orm2 中文文档 3.1 模型属性
  • oschina
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • ReactNativeweexDeviceOne对比
  • React组件设计模式(一)
  • Vue ES6 Jade Scss Webpack Gulp
  • vue脚手架vue-cli
  • 聚类分析——Kmeans
  • 深度学习在携程攻略社区的应用
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 怎样选择前端框架
  • 正则表达式小结
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 国内开源镜像站点
  • ​io --- 处理流的核心工具​
  • ​ssh免密码登录设置及问题总结
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # 安徽锐锋科技IDMS系统简介
  • #define
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $refs 、$nextTic、动态组件、name的使用
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (九)信息融合方式简介
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)Knockout 创建自定义绑定
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)http-server应用
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET CLR基本术语
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)