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

04 OpenCV位平面分解

1 基本概念

位平面分解的核心思想是将图像的每一个像素分解为多个二进制位,分别存储在不同的位平面上。例如,如果一个图像是8位深度的,则可以分解为8个位平面,每个位平面上存储一个二进制位。

位平面分解在图像压缩中有着重要的应用,因为它可以有效减少图像的存储大小。例如,如果一个图像的最高位平面(即最高二进制位)存储的是图像的主要信息,那么将其单独存储可以大大减小图像的大小。

此外,位平面分解技术的应用非常广泛,除了压缩技术以外,在数字水印、和特征提取等方面都有重要的应用。通过对每个位平面进行单独处理,可以更加精细地处理图像信息,提高图像处理的效率和精度。

1.1 位平面分解流程:

  1. 读入灰度图像并将其转换为二进制形式,即将每个像素点的灰度值表示成8位二进制数。
  2. 对于每个像素点的二进制数,将它们按位拆分为8个二进制数,每个数表示一个位平面。
  3. 对于每个位平面,将其转换为0或255的二值图像。具体方法是将每个像素点的该位的二进制数值提取出来,然后将该值赋为0或255。这样就可以得到8个二值图像,每个图像表示了原图像中某一位上的信息。
  4. 保存每个位平面的二值图像,以便后续使用。

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_7b7b0b_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),它们表示了原图像中的信息在每个二进制位上的分布情况。

举个例子,当我们的原始数据像素数据为:
image.png
则首先将其格式转为二进制:
image.png
之后将二进制的各位分别取出,就形成了分解后的位平面:
image.png

2 位平面分解的Python实现

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

image.png
其中x=np.zeros((r, c,8), dtype=np.uint8)语句设置一个用于提取各个位平面的提取矩阵。该矩阵是“r×c×8”大小的,其中r是行高,c是列宽,8表示共有8个通道。矩阵x的8个通道分别用来提取灰度图像的8个位平面。例如,x[:, :,0]用来提取灰度图像的第0个位平面。

  1. 构造表示每个位平面的图像,即将原图像的每个像素的二进制数值按位拆分,并将对应位平面上的像素值赋为该二进制位的数值,其余像素值为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])
  1. 将当前位平面的非零像素值赋为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
  1. 最后,使用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张二值图像。并且位数越高的二值图像,越能体现出原始图像的特征。
image.png

相关文章:

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目录解压安装包&#xf…...

迅为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进行转换?答案是肯定的,但是转换的过程比较复杂,这里为大家介绍一下转换的方法…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...