图像处理-比特平面分层和重构

news2024/11/16 5:46:24

一、比特平面分层

像素是由比特组成的数字。例如在256级灰度图像中,每个像素的灰度是由8比特(一个字节)组成。如下图所示,一幅8比特图像由8个1比特平面组成,其中平面1包含图像中所有像素的最低阶比特,而平面8包含图像中所有像素的最高阶比特。
一幅8比特图像的比特平面表示

比特平面分层原理:

设图像矩阵为
[ 1 2 3 4 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} [1324]
将矩阵中的元素逐个转化为二进制,可以写为:
[ 00000001 00000010 00000011 00000100 ] \begin{bmatrix} 00000001 & 00000010 \\ 00000011 & 00000100 \end{bmatrix} [00000001000000110000001000000100]
这幅图像的8个比特平面矩阵分别为:
第8个比特层图像为: [ 0 0 0 0 ] \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} [0000]
第7个比特层图像为: [ 0 0 0 0 ] \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} [0000]
第6个比特层图像为: [ 0 0 0 0 ] \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} [0000]
第5个比特层图像为: [ 0 0 0 0 ] \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} [0000]
第4个比特层图像为: [ 0 0 0 0 ] \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} [0000]
第3个比特层图像为: [ 0 0 0 1 ] \begin{bmatrix} 0 & 0 \\ 0 & 1 \end{bmatrix} [0001]
第2个比特层图像为: [ 0 1 1 0 ] \begin{bmatrix} 0 &1 \\ 1 & 0 \end{bmatrix} [0110]
第1个比特层图像为: [ 1 0 1 0 ] \begin{bmatrix} 1 & 0 \\ 1 & 0 \end{bmatrix} [1100]

代码实现

#分层处理
def  getBitlayer(img):
    h, w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w, 8))
    for i in range(h):
        for j in range(w):
            n = str(np.binary_repr(img[i, j], 8))
            for k in range(8):
                new_img[i, j, k] = n[k]
    return new_img

分层可视化

## 通过plt子图形式显示每层bit图
def showBitlayer(new_img):
    # 调整图像大小 实际大小为w*100,h*100 pixel
    plt.rcParams['figure.figsize'] = (10, 3.6)
    fig, a = plt.subplots(2, 4)
    m = 0
    n = 8

    for i in range(2):
        for j in range(4):
            plt.axis('off')
            a[i][j].set_title('Bit plane ' + str(n))
            a[i][j].imshow(new_img[:, :, m], cmap=plt.cm.gray)
            m += 1
            n -= 1
    fig.tight_layout()  # 调整整体空白
    plt.subplots_adjust(wspace=0.5, hspace=-0.2)  # 调整子图间距
    plt.savefig('bitLayer.jpg')
    plt.show()

代码结果

原始图像为:

在这里插入图片描述

比特平面分层结果:
在这里插入图片描述

二、图像重构

重构原理

图像分层时,第n层图像的数据,来自于二进制像素值的第n位,将其转换回十进制,则其值为
r ∗ 2 ( n − 1 ) r*2^{(n-1) } r2(n1),那么使用某几层比特层进行重构,就将这几层的像素值转换回十进制后加起来。

原图重构代码

def rebuildImg(bitImags, build_list, img):
    h, w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w))
    for i in range(h):
        for j in range(w):
            for m in build_list:
                new_img[i, j] += bitImags[i, j, 7-m] * (2 ** (m))
    return new_img

重构图像可视化

def showRebuildimgimg(rebuildImag,img):
    plt.figure(figsize=(100, 20))
    plt.subplot(121)
    plt.axis('off')
    plt.imshow(rebuildImag, cmap='gray')
    plt.subplot(122)
    plt.axis('off')
    plt.imshow(img, cmap='gray')
    plt.savefig('rebuiltImag.jpg')
    plt.show()

重构图像结果为:
在这里插入图片描述
左边为第6、7和8层重构结果,右图为原图。

整体代码

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


#分层处理过程
def  getBitlayer(img):
    h, w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w, 8))
    for i in range(h):
        for j in range(w):
            n = str(np.binary_repr(img[i, j], 8))
            for k in range(8):
                new_img[i, j, k] = n[k]
    return new_img


## 通过plt子图形式显示每层bit图
def showBitlayer(new_img):
    # 调整图像大小 实际大小为w*100,h*100 pixel
    plt.rcParams['figure.figsize'] = (10, 3.6)
    fig, a = plt.subplots(2, 4)
    m = 0
    n = 8

    for i in range(2):
        for j in range(4):
            plt.axis('off')
            a[i][j].set_title('Bit plane ' + str(n))
            a[i][j].imshow(new_img[:, :, m], cmap=plt.cm.gray)
            m += 1
            n -= 1
    fig.tight_layout()  # 调整整体空白
    plt.subplots_adjust(wspace=0.5, hspace=-0.2)  # 调整子图间距
    plt.savefig('bitLayer.jpg')
    plt.show()


## bite图像重构
def rebuildImg(bitImags, build_list, img):
    h, w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w))
    for i in range(h):
        for j in range(w):
            for m in build_list:
                new_img[i, j] += bitImags[i, j, 7-m] * (2 ** (m))
    return new_img

def showRebuildimgimg(rebuildImag,img):
    plt.figure(figsize=(100, 20))
    plt.subplot(121)
    plt.axis('off')
    plt.imshow(rebuildImag, cmap='gray')
    plt.subplot(122)
    plt.axis('off')
    plt.imshow(img, cmap='gray')
    plt.savefig('rebuiltImag.jpg')
    plt.show()

if __name__ == '__main__':
    img = cv2.imread(r'dollars.tif', 0)
    bit_imgs=getBitlayer(img)
    showBitlayer(bit_imgs)
    rebuildImg=rebuildImg(bit_imgs,[5,6,7],img)
    showRebuildimgimg(rebuildImg,img)


dollars.tif点击这里下载。

参考博客

https://blog.csdn.net/qq_41398808/article/details/103109111?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-103109111-blog-86769995.235%5Ev38%5Epc_relevant_sort_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-103109111-blog-86769995.235%5Ev38%5Epc_relevant_sort_base2&utm_relevant_index=11
https://blog.csdn.net/qq_42505705/article/details/86769995

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

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

相关文章

人工智能(pytorch)搭建模型17-pytorch搭建ReitnNet模型,加载数据进行模型训练与预测

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型17-pytorch搭建ReitnNet模型,加载数据进行模型训练与预测,RetinaNet 是一种用于目标检测任务的深度学习模型,旨在解决目标检测中存在的困难样本和不平衡…

前端Vue仿京东淘宝我的优惠券列表组件 用于电商我的优惠券列表页面

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…

C++之子类指向父类,父类指向子类总结(一百五十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

nginx配置例子-动静分离实例

动静分离实例 1.准备工作 步骤一:在 根目录/ 下 创建 目录data/www 和 data/image 步骤二:在目录www 下 ,创建a.html文件 步骤三:在目录image下,将图片拖到Xshell客户端,实现图片导入Linux,导…

ITIL 4—发布管理实践

2 基本信息 2.1 目的和描述 关键信息 发布管理实践的目的是使新的和变更的服务及功能均可用。 发布管理实践是为了确保组织及其服务使用者在符合组织政策和协议的前提下,服务可以正常使用而产生的最佳实践。 传统场景下,服务组件(包括基…

QT -20230709

练习&#xff1a; 登录界面增加注册功能(在本地增加用户文件进行比对用户) LoginWindow.h #ifndef LOGINWINDOW_H #define LOGINWINDOW_H#include <QMainWindow> #include <QIcon> #include <QLabel> #include <QLineEdit> #include <QPushButto…

TCP Socket性能优化秘籍:掌握read、recv、readv、write、send、sendv的最佳实践

TCP Socket性能优化秘籍&#xff1a;掌握read、recv、readv、write、send、sendv的最佳实践 博主简介一、引言1.1、TCP Socket在网络通信中的重要性1.2、为什么需要优化TCP Socket的性能&#xff1f; 二、TCP Socket读操作的性能优化2.1、read、recv、readv的功能和用法2.2、提…

有哪些做的问卷调查的工具?

想要洞察市场变化、了解某个特定群体的喜好等情况&#xff0c;使用问卷调查是常见的方法。而互联网的发展&#xff0c;越来越多的人转战网络问卷&#xff0c;而功能各异的问卷工具却让人挑花眼。今天&#xff0c;我们精准针对大家的需求和常见的一些问题&#xff0c;为大家聊一…

ASPICE汽车软件能力如何评估

第一节我们介绍了&#xff1a;什么是ASPICE 上一节我们介绍了&#xff1a;什么是aspice认证 这一节我们看一看&#xff1a;ASPICE汽车软件能力是如何评估 为了使汽车电控系统的研发具有统一的流程和规范的标准&#xff0c;并且使整个开发进度具有可控性和可预测阻借用具有国际…

利用Anaconda完成Python环境安装及配置

1 Anaconda 1.1 配置过程 Anaconda是一个开源的Python和R编程语言的软件包管理器和环境管理器&#xff0c;用于数据科学和机器学习的开发。 进入官网https://www.anaconda.com/下载安装包next->argee进入下列界面&#xff0c;选择Just Me 选择安装路径&#xff0c;点击Ne…

Swagger-Bootstrap-UI

Swagger-Bootstrap-UI 是一个为 Swagger 提供美观、易用的界面展示和增强功能的开源项目。它通过自定义样式和交互&#xff0c;提供了更好的文档展示和交互体验&#xff0c;包括美化的界面、接口测试工具、在线调试、文档导出等功能。 更高阶的有Knife4j,Knife4j是一个集Swagg…

本地部署 ChatPPT

本地部署 ChatPPT 1. 什么是 ChatPPT2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatPPT6. 运行 ChatPPT 1. 什么是 ChatPPT ChatPPT由chatgpt提供支持&#xff0c;它可以帮助您生成PPT/幻灯片。支持中英文输出。 2. Github 地址 https://github.com/huimi24/…

CS制作office宏文档钓鱼

前言 书接上文&#xff0c;CobaltStrike_1_部署教程&#xff0c;改篇介绍【CS制作office宏文档钓鱼】。PS&#xff1a;文章仅供学习使用&#xff0c;不做任何非法用途&#xff0c;后果自负&#xff01; 一、CobaltStrike 4.X安装部署 部署安装之前的文章已经介绍过了&#xf…

一个自定义中间放大CollectionViewLayout

效果图如下 思路&#xff1a; 根据cell距离屏幕中间的距离&#xff0c;设置cell的缩小系数&#xff0c;并通过设置 attributes.transform 缩小cell attributes.transform CGAffineTransformMakeScale(1.0, scale); 核心代码 // // LBMiddleExpandLayout.m // LiuboMiddle…

微服务之服务器缓存

Informal Essay By English In the difficult employment situation, we need to set a good goal and then do our own thing 参考书籍&#xff1a;“凤凰架构” 进程缓存&#xff08;Cache&#xff09; 缓存在分布式系统是可选&#xff0c;在使用缓存之前需要确认你的系统…

Elasticsearch【集群概念、搭建集群】(七)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch集群_概念 Elasticsearch集群_搭建集群 Elasticsearch集群_概念 在单台ES服务器上&#xff0c;随着一个索引内数据的增多&#xff0c;会产生存储、效率、安全等问题。 1、假设项目中有一个500G大小的索引&#xff0c;但我们只有几台200G硬盘 的服务器&am…

Debezium日常分享系列之:流式传输 Cassandra

Debezium日常分享系列之&#xff1a;流式传输 Cassandra 一、批量 ETL 选项二、流媒体选项三、Kafka 作为事件源四、解析提交日志五、提交日志深入探讨1.延迟处理2.空间管理3.重复的事件4.无序事件5.带外架构更改6.行数据不完整 六、最低限度可行的基础设施1.无状态流处理2.有状…

45. 跳跃游戏 II (贪心)

题目链接&#xff1a;力扣 解题思路&#xff1a;贪心&#xff0c;尽可能地找到下一跳能够跳到的最远距离&#xff0c;这样到达终点时&#xff0c;所需跳跃次数最少 以nums [2,3,1,1,4,2]为例&#xff1a; 以当前位置begin作为起跳点&#xff0c;能够跳跃的最远距离为m&#…

影视剧配音软件哪个好?几款好用的影视剧配音软件推荐

影视剧配音软件哪个好&#xff1f;几款好用的影视剧配音软件推荐 我们日常刷短视频的时候&#xff0c;经常会刷到一些影视剧相关的作品&#xff0c;特别是一些大热剧及经典剧&#xff0c;很多创作者都喜欢融入自己的解读&#xff0c;进行一些加工&#xff0c;形成一部的独一无…

STM32 Mac开发环境Clion+STM32CubeMX+ST-Link-V2

STM32 Mac开发环境ClionSTM32CubeMXST-Link-V2 也不知道什么时候买的stm32板吃灰太久&#xff0c;不会玩&#xff0c;环境之前都没搞定&#xff0c;今天又折腾一天终于可以点灯了。 安装编译器gcc brew tap ArmMbed/homebrew-formulae brew install arm-none-eabi-gccOPEN-O…