04 OpenCV位平面分解
1 基本概念
位平面分解的核心思想是将图像的每一个像素分解为多个二进制位,分别存储在不同的位平面上。例如,如果一个图像是8位深度的,则可以分解为8个位平面,每个位平面上存储一个二进制位。
位平面分解在图像压缩中有着重要的应用,因为它可以有效减少图像的存储大小。例如,如果一个图像的最高位平面(即最高二进制位)存储的是图像的主要信息,那么将其单独存储可以大大减小图像的大小。
此外,位平面分解技术的应用非常广泛,除了压缩技术以外,在数字水印、和特征提取等方面都有重要的应用。通过对每个位平面进行单独处理,可以更加精细地处理图像信息,提高图像处理的效率和精度。
1.1 位平面分解流程:
- 读入灰度图像并将其转换为二进制形式,即将每个像素点的灰度值表示成8位二进制数。
- 对于每个像素点的二进制数,将它们按位拆分为8个二进制数,每个数表示一个位平面。
- 对于每个位平面,将其转换为0或255的二值图像。具体方法是将每个像素点的该位的二进制数值提取出来,然后将该值赋为0或255。这样就可以得到8个二值图像,每个图像表示了原图像中某一位上的信息。
- 保存每个位平面的二值图像,以便后续使用。
1.2 位平面分解算法原理
假设原图像为 I(x,y)I(x,y)I(x,y),灰度级为 g(x,y)g(x,y)g(x,y),每个像素点的灰度值可以表示成一个8位的二进制数,即 g(x,y)=b727+b626+b525+b424+b323+b222+b121+b0g(x,y) = b_7 2^7 + b_6 2^6 + b_5 2^5 + b_4 2^4 + b_3 2^3 + b_2 2^2 + b_1 2^1 + b_0g(x,y)=b727+b626+b525+b424+b323+b222+b121+b0,其中 b7b_7b7 到 b0b_0b0 分别表示第7位到第0位的二进制值,取值为0或1。
对于第 iii 个位平面,可以通过如下公式将其转换为0或255的二值图像 Pi(x,y)P_i(x,y)Pi(x,y):
Pi(x,y)={255if bi=10if bi=0P_i(x,y) = \begin{cases} 255 & \text{if } b_i = 1 \\ 0 & \text{if } b_i = 0 \end{cases}Pi(x,y)={2550if bi=1if bi=0
这里 bib_ibi 表示 g(x,y)g(x,y)g(x,y) 的第 iii 位二进制值。
因此,可以将原图像 I(x,y)I(x,y)I(x,y) 的每个像素点的二进制值拆分成8个位平面,得到8个二值图像 P0(x,y),P1(x,y),⋯,P7(x,y)P_0(x,y), P_1(x,y), \cdots, P_7(x,y)P0(x,y),P1(x,y),⋯,P7(x,y),它们表示了原图像中的信息在每个二进制位上的分布情况。
举个例子,当我们的原始数据像素数据为:

则首先将其格式转为二进制:

之后将二进制的各位分别取出,就形成了分解后的位平面:

2 位平面分解的Python实现
- 使用OpenCV的
imread函数读入一幅灰度图像,灰度值范围为0~255,并用imshow函数显示原图像。
import cv2
import numpy as np # 读入灰度图像并显示
lena = cv2.imread("lenacolor.png", 0)
cv2.imshow("lena", lena)
- 获取图像的尺寸,即行数和列数。
# 获取图像的尺寸
r, c = lena.shape
- 构造表示二进制位的图像,即构造8个大小与原图像大小相同的图像,每个图像上的像素值表示二进制数值的某一位。即(1,2,4,...,128)(1,2,4,...,128)(1,2,4,...,128)如换算成二进制则为(00000001,00000010,00000100,...,10000000)(0000 0001,0000 0010,0000 0100,...,1000 0000)(00000001,00000010,00000100,...,10000000)
# 构造表示二进制位的图像
x = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8): x[:, :, i] = 2 ** i
print(x)

其中x=np.zeros((r, c,8), dtype=np.uint8)语句设置一个用于提取各个位平面的提取矩阵。该矩阵是“r×c×8”大小的,其中r是行高,c是列宽,8表示共有8个通道。矩阵x的8个通道分别用来提取灰度图像的8个位平面。例如,x[:, :,0]用来提取灰度图像的第0个位平面。
- 构造表示每个位平面的图像,即将原图像的每个像素的二进制数值按位拆分,并将对应位平面上的像素值赋为该二进制位的数值,其余像素值为0。并执行二进制维度上的
AND关系。使用OpenCV的位运算 AND 可以直接执行上述操作。与运算的讲解点此查看
# 构造表示每个位平面的图像,并显示
r = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8): # 使用位运算 AND 获取当前位平面的二值图像 r[:, :, i] = cv2.bitwise_and(lena, x[:, :, i])
- 将当前位平面的非零像素值赋为255,将该位平面的二值图像转换为0/255的形式。这是因为位平面分解后的图像应为二值图像,而Python在展示是默认为8位像素。因此我们要将二值的0或1转化为8位的0或255。
for i in range(8): # 使用位运算 AND 获取当前位平面的二值图像 r[:, :, i] = cv2.bitwise_and(lena, x[:, :, i]) print(r) # 将非零像素值赋为255,将当前位平面的二值图像转换为0/255的形式 mask = r[:, :, i] > 0 r[mask] = 255
- 最后,使用
imshow函数显示当前位平面的二值图像。完整的函数如下:
import cv2
import numpy as np # 读入灰度图像并显示
lena = cv2.imread("lenacolor.png", 0)
#cv2.imshow("lena", lena) # 获取图像的尺寸
r, c = lena.shape # 构造表示二进制位的图像
x = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8): x[:, :, i] = 2 ** i
print(x) # 构造表示每个位平面的图像,并显示
r = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8): # 使用位运算 AND 获取当前位平面的二值图像 r[:, :, i] = cv2.bitwise_and(lena, x[:, :, i]) print(r) # 将非零像素值赋为255,将当前位平面的二值图像转换为0/255的形式 mask = r[:, :, i] > 0 r[mask] = 255 # 显示当前位平面的二值图像 cv2.imshow(str(i), r[:, :, i]) # 等待用户按下任意键,然后关闭所有窗口
cv2.waitKey()
cv2.destroyAllWindows()
最终,图象被分解成了8张二值图像。并且位数越高的二值图像,越能体现出原始图像的特征。

相关文章:
04 OpenCV位平面分解
1 基本概念 位平面分解的核心思想是将图像的每一个像素分解为多个二进制位,分别存储在不同的位平面上。例如,如果一个图像是8位深度的,则可以分解为8个位平面,每个位平面上存储一个二进制位。 位平面分解在图像压缩中有着重要的…...
Onvif协议如何判断摄像机支持 —— 筑梦之路
有人就问什么是Onvif协议呢? 全称为:Open Network Video Interface Forum.缩写成Onvif。 翻译过来是:开放型网络视频接口论坛,目的是确保不同安防厂商的视频产品能够具有互通性,这样对整体安防行业才是良性发展。 现…...
情人节new一个对象给你
今天情人节,有没对象的吗?假设你不知道new怎么用,每个人都有两种身份,一种没对象的人,这个时候new一个对象给你,一种是有对象的人,这个delete对象。等你学完这个new和delete知识点,无…...
linux篇【15】:应用层-网络https协议
目录 一.HTTPS介绍 1.HTTPS 定义 2.HTTP与HTTPS (1)端口不同,是两套服务 (2)HTTP效率更高,HTTPS更安全 3.加密,解密,密钥 概念 4.为什么要加密? 5.常见的加密方式…...
索引-性能分析-explain
explain 执行计划 explain 执行计划各字段含义 1)id 就是代表 sql 的执行顺序或者表的执行顺序;id相同从上往下执行,id不同,id值越大越先执行;(注:有子查询时就会出现sql执行顺序)…...
mbedtls加密组件使用示例
1 mbedtls aes组件的使用 1.1 AES ECB加解密接口使用 int main(int argc, char *argv[]) {char key[256];char *inbuf calloc(1, 257);char *outbuf calloc(1, 257);char *buf calloc(1,257);char *tmp_outbuf outbuf;char *tmp_buf buf;mbedtls_aes_context aes_ctx;mb…...
如何量测太阳光模拟器的光谱致合度?
太阳模拟器是根据国际法规JIS、IEC60904、美国材料试验协会开发设计的AAA级太阳模拟器。对于100毫米100毫米和200毫米200毫米的光斑尺寸,光斑强度的输出功率范围可以从0.1到1太阳光强度。此外,还提供了灵活的出光方向,以满足用户的研究需求&a…...
网络安全领域中CISP证书八大类都有什么
CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional),是经中国信息安全产品测评认证中心实施的国家认证,对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...
17- 梯度提升回归树GBRT (集成算法) (算法)
梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题,也可以用于回归问题中。在该模型中,有三个重要参数分别为 n_…...
05 OpenCV色彩空间处理
色彩空间(Color Space)是一种用于描述颜色的数学模型,它将颜色表示为多维向量或坐标,通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异,不同的…...
【CS224图机器学习】task1 图机器学习导论
前言:本期学习是由datawhale(公众号)组织,由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习?通过图这种数据结构,对跨模态数据进行整理。…...
Powershell Install SQL Server 2022
前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…...
Jetson NX2 装机过程
1.固态硬盘安装完成后,系统配置 df -h 查看硬盘使用情况 2.查看Jetson NX的IP地址,以下两个都行 ifconfig ip address show 3.Jetson NX2安装arm64的annaconda3,安装有问题报错illegal instruction,未解决。 4.VNC远程登录 …...
初始C++(四):内联函数
文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 二.内联函…...
九、初识卷积
文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时,神经网络的前几层需要完成对图像的边缘检测任务,所谓的边缘检测就是让计算机识别出一张图片的垂直…...
【Linux】【编译】编译调试过程中如何打印出实际的编译命令
🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Linux技术&…...
linux安装jdk
step1 下载jdk 到下面的网站下载需要的jdk安装包版本。 Java Downloads | Oracle step2 复制到opt目录 其中user_name对应自己的home目录的用户文件夹 sudo cp /home/user_name//home/czh/Downloads/jdk-17_linux-x64_bin.tar.gz /opt/ step3 到opt目录解压安装包…...
迅为iTOP-3A5000龙芯开发板安装UOS操作系统
3A5000板卡采用全国产龙芯3A5000处理器,基于龙芯自主指令系统(LoongArch),市面上龙芯3A5000主板价格都在上万元,可以说是非常贵了, 迅为全新推出了款千元内的iTOP-3A5000开发板,这款板卡各方面的配置也是第…...
Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)
Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接:https://sysin.org/blog/chrome-firefox-download/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 天下只剩三种(主流&am…...
如何使用ArcGIS转换坐标
1.概述大家都知道ArcGIS提供了坐标转换功能,在我们手里的数据坐标系千差万别,经常会遇到转换坐标的时候,那么是否可以用ArcGIS进行转换?答案是肯定的,但是转换的过程比较复杂,这里为大家介绍一下转换的方法…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
