【python】OpenCV—Bitplane

在这里插入图片描述

学习来自:

  • 位平面分割(Bit-Plane Slicing)
  • 使用OpenCV+Python进行图像处理的初学者指南

位平面

位平面(bitplane)是一个在计算机科学中用于描述图像数据的概念,具体定义如下:

  • 【定义】:位平面是用图像作为底面,用表示像素亮度大小的二进制数(通常为8位)作为高度,所形成的一个立体直方图。在这个直方图中,各像素位置相同的位会形成一个平面,这个平面就被称为“位平面”。
  • 【解释】:
    • 对于一个灰度图像,每个像素的亮度通常由一个8位的二进制数表示,这个二进制数的范围是00000000(亮度为0)到11111111(亮度为255)。
    • 如果我们将这些二进制数的每一位(从最低位到最高位)分别提取出来,并单独处理,那么就可以得到8个位平面。每个位平面都是一个二值图像,其中像素值要么是0,要么是1。
    • 最低位(Least Significant Bit,LSB) 的位平面通常包含图像中的噪声和细节信息,而 最高位(Most Significant Bit,MSB) 的位平面则包含图像的主要轮廓和形状信息。
  • 【用途】:位平面的概念在图像处理、压缩和传输中有重要应用。通过分析或修改不同的位平面,我们可以对图像进行各种操作,如降噪、增强、压缩等。

综上所述,位平面是图像处理中的一个重要概念,它通过将图像的每个像素的二进制表示进行分解,得到一系列的二值图像,这些二值图像就是位平面。每个位平面都包含了图像的不同信息,通过处理这些位平面,我们可以对图像进行各种操作。

在这里插入图片描述

位平面分割

位平面分割(Bit-Plane Slicing)是一种在数字图像处理中分析图像各个位级的方法。具体来说,位平面分割是指将图像的灰度值(通常是一个8位的二进制数)按照每一位(从最低位到最高位)进行拆解,从而得到多个独立的位平面。

  • 【基本概念】:

    • 位平面:一个灰度图像的每个像素值通常由一个8位的二进制数表示,这个二进制数的每一位都可以视为一个独立的平面,称为位平面。
    • 位平面分割:将灰度图像的每个像素值的二进制表示中的每一位单独提取出来,形成独立的位平面图像。
  • 【分割过程】:

    • 对于一个8位深度的灰度图像,可以将其分割为8个位平面。
    • 每个位平面上的像素值只有0或1,代表原图像在该位上的值。
    • 最高位(MSB)的位平面通常包含图像的主要轮廓和形状信息,而最低位(LSB)的位平面则包含噪声和细节信息。
  • 【应用】:

    • 位平面分割在图像压缩中有着重要的应用,因为它可以有效减少图像的存储大小。例如,如果一个图像的最高位平面存储的是图像的主要信息,那么将其单独存储可以大大减小图像的大小
    • 位平面分割也广泛应用于数字水印、特征提取等领域,通过对每个位平面进行单独处理,可以更加精细地处理图像信息,提高图像处理的效率和精度。
  • 【操作步骤】:

    • 读入灰度图像并将其转换为二进制形式,即将每个像素点的灰度值表示成8位二进制数。
    • 对于每个像素点的二进制数,将它们按位拆分为8个二进制数,每个数表示一个位平面。
    • 对于每个位平面,将其转换为0或255的二值图像。具体方法是将每个像素点的该位的二进制数值提取出来,然后将该值赋为0或255。
    • 保存每个位平面的二值图像,以便后续使用。

总之,位平面分割是一种有效的图像处理技术,它通过将图像的灰度值按照每一位进行拆解,得到多个独立的位平面,从而可以对图像进行更精细的分析和处理。

应用例子

实现一

利用 bitwise_and

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

image = cv2.imread("1.jpg", cv2.IMREAD_GRAYSCALE)

bit_planes = []

for i in range(8):
    bit_plane = cv2.bitwise_and(image, 1 << i)
    bit_plane *= 255
    bit_planes.append(bit_plane)

# for i, plane in enumerate(bit_planes):
#     cv2.imshow(f'Bit plane {i}', plane)
#     # cv2.imwrite(f"bitplane{i}.jpg", plane)
# cv2.waitKeyEx(0)
# cv2.destroyAllWindows()

fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(10, 8),
                        subplot_kw={'xticks':[], 'yticks':[]})
fig.subplots_adjust(hspace=0.05, wspace=0.05)
for ax, img in zip(axes.flat, bit_planes):
    ax.imshow(img, cmap="gray")
plt.tight_layout()
plt.show()

原图

在这里插入图片描述
各级位平面图

在这里插入图片描述

下面仔细看看

bitplane1
在这里插入图片描述

bitplane2
在这里插入图片描述

bitplane3
在这里插入图片描述

bitplane4
在这里插入图片描述

bitplane5

在这里插入图片描述

bitplane6

在这里插入图片描述

bitplane7

在这里插入图片描述

bitplane8

在这里插入图片描述

实现二

暴力,获取每位二进制数值

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

gray = cv2.imread("1.jpg", cv2.IMREAD_GRAYSCALE)

c1 = np.mod(gray, 2)
c2 = np.mod(np.floor(gray/2), 2)
c3 = np.mod(np.floor(gray/4), 2)
c4 = np.mod(np.floor(gray/6), 2)
c5 = np.mod(np.floor(gray/8), 2)
c6 = np.mod(np.floor(gray/16), 2)
c7 = np.mod(np.floor(gray/64), 2)
c8 = np.mod(np.floor(gray/128), 2)

# reconstructing image with 3 most significant bit planes
cc = 2 * (2 * (2 * c8 + c7) + c6)

bit_planes = [gray, c1, c2, c3, c4, c5, c6, c7, c8, cc]

fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(10, 8),
                        subplot_kw={'xticks':[], 'yticks':[]})
fig.subplots_adjust(hspace=0.05, wspace=0.05)
for ax, img in zip(axes.flat, bit_planes):
    ax.imshow(img, cmap="gray")
plt.tight_layout()
plt.show()

输入
在这里插入图片描述
输出

第一张图是原图的灰度图

第二张到第九张即为 8 层位平面可视化结果

最后一张图是合并了 6、7、8 三层位平面尝试还原原图,效果还是可以接受的
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

22、matlab锯齿波、三角波、方波:rectpuls()函数/sawtooth()函数/square()函数

1、采样的非周期性矩形 语法 语法1&#xff1a;y rectpuls(t) 返回一个以数组 t 中指示的采样时间采样的连续非周期性单位高度矩形脉冲&#xff0c;该矩形脉冲以 t 0 为中心。 语法2&#xff1a;y rectpuls(t,w) 生成一个宽度为 w 的矩形 参数 t:采样时间 w:矩形宽度…

网络编程(五)

网络编程&#xff08;五&#xff09; 网络服务器超时检测使用select进行超时检测套接字属性**getsockopt:获取socket软通道的某项属性值**setsockopt:设置socket软通道的某项属性值**&#xff08;socket建立之后就可使用&#xff09; 信号**signal()&#xff1a;信号处理函数se…

34. 【Java教程】反射

本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射&#xff08;reflection&#xff09;&#xff0c;很多小伙伴即便参与了工作&#xff0c;可能也极少用到 Java 反射机制&#xff0c;但是如果你想要开发一个 web 框架&#xff0c;反射是不可或缺的知识点。本小节我们将…

天诚学校物联网锁、公租房智能门锁亮相2024永康门博会

5月26-28日&#xff0c;全场景AIoT解决方案服务商——江苏新巢天诚智能技术有限公司&#xff08;以下简称“天诚”&#xff09;盛装出席第14届中国&#xff08;永康&#xff09;国际门业博览会&#xff08;以下简称“门博会”&#xff09;。 门博会亮点十足 作为享誉海内外的…

产品评测:Coolmuster Android Eraser - 安全彻底删除Android数据的利器

产品概述 在数字化时代&#xff0c;智能手机成为了个人敏感信息的集中地。当涉及到数据隐私和安全时&#xff0c;简单的删除操作并不能满足我们对数据彻底清除的需求。Coolmuster Android Eraser正是为了解决这一问题而生&#xff0c;它是一款专为Android设备设计的第三方软件&…

VUE封装-自定义权限控制指令

在实际开发中&#xff0c;会遇到很多的权限控制、资源位的场景&#xff0c;其实就是用来控制某个组件的展示与否&#xff0c;可以是一个按钮、一个报表、一个TAB页面等 例如下图&#xff0c;我想通过当前登录的用户控制谷歌的这个logo显示与否 因为设计到的权限、资源位控制比…

图片中线段和圆圈检测(python opencv)

前言 本文实现将一个图片中的线段和圆圈检测出来&#xff0c;效果就像这样 开始之前请先自行安装 opencv 另外还用到了一个用来检测直线&#xff1a; http://olena.pages.lre.epita.fr/pylena/index.html pip install pylena直线检测 先用 opencv 来检测直线, 因为下面代码…

天融信 2023 的年终奖。。

天融信 过去几天&#xff0c;最大的瓜&#xff0c;是天融信 2023 的年终奖脚踝砍。 "天融信"是国内首家网络安全企业&#xff0c;同时也是一家上市公司。 就在前些天&#xff0c;有网友爆料出&#xff0c;天融信年终奖到账只有几百元&#xff0c;甚至只有几十元&…

铝包木门窗性能优异 国内产量及需求量总体呈增长态势

铝包木门窗性能优异 国内产量及需求量总体呈增长态势 铝包木门窗是在保留纯实木门窗特性和功能的前提下&#xff0c;将隔热断桥铝合金型材和实木通过机械方法复合而成的框体。铝包木门窗具有良好的密封性、保温性、抗腐蚀性、隔音性等&#xff0c;能够满足市场对门窗质量要求不…

【Linux-阻塞,非阻塞,异步】

Linux-阻塞&#xff0c;非阻塞&#xff0c;异步 ■ Linux-阻塞-非阻塞 IO-异步■ Linux-阻塞IO■ 阻塞IO简介■ open■ 等待队列■ 示例一&#xff1a;APP阻塞IO读取进入睡眠后-等待队列唤醒进程■■ ■ Linux-非阻塞IO■ 非阻塞IO简介■ open■ 轮询■ 1、select 函数■ 2、po…

【轻触按键】开关机电路--填坑1

接上文&#xff0c;挖的坑 一、翻转电路 二、真值表 按键按下去&#xff0c;1G17会拉低&#xff0c;A端脚会掉电&#xff0c;下降沿&#xff1b;终到逻辑“0” 松开按键&#xff0c;1G17会拉高&#xff0c;A端脚充电&#xff0c;上升沿&#xff1b;终到逻辑“1”&#xff1b; …

[补题记录]LeetCode 6.Z字形变换

传送门&#xff1a;Z字形变换 转自&#xff1a;Z字形变换 Thought/思路 关键点在于&#xff0c;最后的答案是一行行连接起来的。 这样我们就会发现&#xff0c;这个 Z 字&#xff0c;实际上会让行数 不断加 1&#xff0c;然后又 不断减 1。每次按顺序选择 S 中的一个字符即…

visual studio打包qt算子时,只生成dll没有生成lib等文件

问题&#xff1a;在visual studio配置了qt项目&#xff0c;并打包成dll&#xff0c;原则上会生成一堆文件&#xff0c;包括dll,lib等文件。 解决办法&#xff1a; 挨个右击源代码的所有头文件-》属性-》项类型。改成qt头文件形式&#xff0c;如下。

961题库 北航计算机 计算机网络 附答案 简答题形式

有题目和答案&#xff0c;没有解析&#xff0c;不懂的题问大模型即可&#xff0c;无偿分享。 第1组 习题 某网络拓扑如题下图所示&#xff0c;其中 R 为路由器&#xff0c;主机 H1&#xff5e;H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干以太网交换机…

C#中使用Mapster

Mapster是一个开源的.NET对象映射库&#xff0c;它提供了一种简单而强大的方式来处理对象之间的映射。 多个映射框架的性能对比&#xff1a; 第一步安装Mapster 使用方法 public class Test {public string name { get; set; }public string sex { get; set; }public string…

光伏并网逆变器UL 1741:2021标准解析

光伏并网逆变器UL 1741:2021标准解析 不同国家的安规认证可以说是光伏逆变器走向国际市场的一张通行证&#xff0c;由于全球各国家的电网制式及并网政策的不同差异&#xff0c;这对逆变器测试顺利的通过安规测试认证 还是有一定的技术难度&#xff0c;也是中国光伏制造企业迫切…

在Linux中tomcat占用内存过高可以通过导出hprof日志来解决

自动导出hprof日志 第一种方法&#xff1a; Tomcat的hprof日志是一种用于分析Java堆内存使用情况的工具&#xff0c;它可以帮助开发人员找到内存泄漏的原因。 hprof日志可以在特定的时间点对Java堆内存进行快照&#xff0c;并生成详细的分析报告。 启用hprof日志导出的具体…

零基础写框架:从零设计一个模块化和自动服务注册框架

模块化和自动服务注册 基于 ASP.NET Core 开发的 Web 框架中&#xff0c;最著名的是 ABP&#xff0c;ABP 主要特点之一开发不同项目(程序集)时&#xff0c;在每个项目中创建一个模块类&#xff0c;程序加载每个程序集中&#xff0c;扫描出所有的模块类&#xff0c;然后通过模块…

“去员工化”这个潮流谁也挡不住,六大诱因分析。

去员工化→恐怕是未来工作的主流&#xff0c;一方面有成本的原因&#xff0c;另一方面也有技术进步、雇佣形式创新等原因&#xff0c;这个潮流有利也有弊&#xff0c;关键看我们是如何兴利除弊。 "去员工化"是指企业在运营中减少或取消传统雇佣制度&#xff0c;更多…

HOW - vscode 使用指南

目录 一、基本介绍1. 安装 VS Code2. 界面介绍3. 扩展和插件4. 设置和自定义 二、常用界面功能和快捷操作&#xff08;重点&#xff09;常用界面功能快捷操作 三、资源和支持 Visual Studio Code&#xff08;VS Code&#xff09;是一款由微软开发的免费、开源的代码编辑器&…