04 OpenCV位平面分解

news2024/12/23 9:23:26

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 ) = 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 0 g(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_0 g(x,y)=b727+b626+b525+b424+b323+b222+b121+b0,其中 b 7 b_7 b7 b 0 b_0 b0 分别表示第7位到第0位的二进制值,取值为0或1。

对于第 i i i 个位平面,可以通过如下公式将其转换为0或255的二值图像 P i ( x , y ) P_i(x,y) Pi(x,y)

P i ( x , y ) = { 255 if  b i = 1 0 if  b i = 0 P_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
这里 b i b_i bi 表示 g ( x , y ) g(x,y) g(x,y) 的第 i i i 位二进制值。

因此,可以将原图像 I ( x , y ) I(x,y) I(x,y) 的每个像素点的二进制值拆分成8个位平面,得到8个二值图像 P 0 ( x , y ) , P 1 ( x , y ) , ⋯   , P 7 ( 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

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

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

相关文章

对Node.js 的理解?优缺点?应用场景?

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…

中国计算机设计大赛来啦!用飞桨驱动智慧救援机器狗

‍‍中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一,自2008年开赛至今,一直由教育部高校与计算机相关教指委等或独立或联合主办。大赛的目的是以赛促学、以赛促教、以赛促创,为国家培养德智体美劳全面发展的创新型、复合型、应…

保姆级Vue3+Vite项目实战多布局(下)

写在前面注:本文首发掘金签约专栏,此文为文章同步!本文为 Vue3Vite 项目实战系列教程文章第三篇,系列文章建议从头观看效果更佳,大家可关注专栏防走失!点个赞再看有助于全文完整阅读!此系列文章…

如何在 C++ 应用程序中集成 Spire.XLS for C++

Spire.XLS for C 是一个 Excel 库,供开发人员在任何类型的 C 应用程序中操作 Excel 文档(XLS、XLSX、XLSB 和 XLSM)。 本文演示了如何以两种不同的方式将 Spire.XLS for C 集成到您的 C 应用程序中。 通过 NuGet 安装Spire.XLS for C通过手动…

一篇文章带你读懂HashMap

HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起,HashMap有四个构造方法,别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…

企业数字化转型和升级:架构设计方法与实践

企业架构整体结构图例:企业架构整体结构企业架构整体结构从战略层、规划层、落地层这三层来分别对应企业架构中业务、架构和实施的各种重要活动和产出。业务架构,数据架构,应用架构和技术架构之间的内在逻辑联系:图例:企业架构整体…

什么,Excel竟然听得懂人话!?!

Excel知道我们想干啥,不相信?看下面的案例。“数据格式”列中规定了各种数据元类型的长度、保留位数等,我们需要提取对应的数值作为“字段长度”列。比如an..100取100,n4取4,an..100,3取100,..ul取1000&…

C语言学习笔记-排序算法

选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小&…

元宇宙营销面临的三大挑战

元宇宙的营销就像在早期的互联网建立一个网站一样,你没有多少可以向过去借鉴的,这个领域一切都是崭新的。对于一个实验性很强的项目而言,你很难知道要投入多少的时间和资源,而且这个项目也不一定能保障收益以及满足其他的一些关键…

[小记]注入服务进程/跨session注入

最近测试注入遇到一个问题:OpenProcess 失败,报错码:5,没有权限。 问题排查: 1,是否是管理员权限启动程序? 是 2,注入的目标进程有什么特殊? 目标进程是svchost.exe&…

【PyQt】PyQt学习(二)模块介绍+QObject学习

简介 PyQt API 是一组包含大量类和函数的模块。核心模块如下: QtGui:包含了窗口系统、事件处理(QEvent)、2D 图像(QImage)、基本绘画、字体(QFont)和文字类;QtCore&…

02.13:监督学习中的分类问题

今天首先学习了监督学习中的分类问题,跑了两个代码。现在学起来感觉机器学习有很多不同的定理建立了不同的分类器,也就是所谓不同的方法。具体的数学原理我不太清楚。然后不同的应用场景有一个最优的分类器。 值得一提的应该就是终于清晰的明白了精度&am…

IDEA 中使用 Git 图文教程详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

记录一次time_wait与close_wait的检查

框架与语言:php tp6swoole 原因:每隔几天就会出现,redis:Cannot assign requested address 开始想法,谷歌、百度。然后结果都是配置系统参数。比如下面例子 vi /etc/sysctl.confvm.overcommit_memory 1 net.core.somaxconn 6024 net.ip…

记录--数组去重的五种方法

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 您或许会疑惑,网上那么多去重方法,这篇文章还有什么意义? 别着急,这篇文章只节选了简单的,好玩的,古老的,有实际…

内网渗透(二十四)之Windows协议认证和密码抓取-Mimikatz读取sam和lsass获取密码

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

ILSSI国际研讨会将为您呈现六西格玛技术的未来与前景

ILSSI 欢迎世界各地的精益六西格玛专业人士参加即将举行的2023年国际精益六西格玛研讨会,这次研讨会将邀请到世界各地的专家学者,分享他们的专业知识和经验,并就精益六西格玛等相关议题进行探讨和交流。 这是一个绝佳的机会,让您…

Hudi-集成Flink

文章目录集成Flink环境准备sql-client方式启动sql-client插入数据查询数据更新数据流式插入code 方式环境准备代码类型映射核心参数设置去重参数并发参数压缩参数文件大小Hadoop参数内存优化读取方式流读(Streaming Query)增量读取(Increment…

MongoDB简介入门docker安装MongDB,Spring集成MongDB

一、MongoDB简介1、NoSQL简介NoSQL(NoSQL Not Only SQL),意即反SQL运动,指的是非关系型的数据库,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储…

【C++初阶】十一、STL---priority_queue(总)

目录 一、priority_queue介绍 二、priority_queue使用 三、仿函数 四、priority_queue模拟实现 4.1 版本1 4.2 版本2 一、priority_queue介绍 priority_queue文档介绍 翻译; (1)优先队列是一种容器适配器,根据严格的弱排序标准&#x…