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

news2024/12/25 22:12:31

一、比特平面分层

像素是由比特组成的数字。例如在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/747359.html

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

相关文章

Linux开发工具gdb篇

文章目录 🎻0.前言🎼debug版本🎼release版本 🪕1. gcc/g的默认版本🎸2. gdb使用🎵进入 & 退出🎵查看代码🎵断点 & 跳断点🎵逐过程 & 逐语句🎵监视…

Spring Boot 核心运行原理介绍

Spring Boot 核心运行原理介绍 引言整体介绍1. 核心运行原理图2. 自动配置的整体流程3. 各核心功能和组件初步介绍 总结 引言 还记得,笔者在前面的博文《Spring Boot 项目介绍》中提到了,Spring Boot 最核心的功能就是自动配置,该功能的实现…

编辑距离算法(Levenshtein Distance Algorithm)的概念理解及其应用

概念: 编辑距离,由俄罗斯科学家Vladimir Levenshtein于1965年提出,因此又称为Levenshtein Distance,简称LD,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。 可用的编辑操作包括:…

使用docker的常见bug

BUG1:磁盘被占满导致docker无法使用 docker ps 【查看docker能否正常使用】 正常的话会打印下图信息: 不正常的话打印如下图信息: journalctl -u docker 【查看docker无法正常使用的原因】,本次测试中遇到下图bug,意思是/var/l…

短视频抖音seo矩阵源码saas--技术开发部署分享

抖音seo源码开发,抖音矩阵源码,短视频seo源码,短视频矩阵源码技术开发部署,模式采用SaaS形式,用户角色分为:总后台,加盟商,企业用户,角色权限划分清楚,多模式…

简单认识MySQL基础部分

文章目录 一、数据库概述1、简介2、数据库类型和常用数据库1.关系型数据库2.非关系型数据库 3、mysql数据库日志1、作用:2、 mysql与 oracle 日志有所区别3、 Mysql 存储引擎 二、数据库基础操作1、SQL 语句2、实际操作1、DDL:数据定义语言,用…

机器学习技术(五)——特征工程与模型评估

机器学习技术(五)——特征工程与模型评估(2️⃣) 文章目录 机器学习技术(五)——特征工程与模型评估(:two:)二、模型评估1、Accuracy score2、Confusion matrix混淆矩阵1、多值2、二值 3、Hamming loss4、Precision, recall and F…

石英灯和石墨加热器结构热试验装置中的低气压控制解决方案

摘要:为解决结构热试验和热真空试验中的低气压真空压力精密控制问题,本文基于动态平衡法和上下游控制模式,提供了相应的解决方案。解决方案中的低气压真空压力控制系统主要是采用电控针阀、电控球阀和双通道真空压力控制器组成上下游两个闭环…

从源码角度看 Golang 的调度

1.简单概念 1.1 调度器的三个抽象概念:G、M、P G:代表一个 goroutine,每个 goroutine 都有自己独立的栈存放当前的运行内存及状态。可以把一个 G 当做一个任务。M: 代表内核线程(Pthread),它本身就与一个内核线程进行绑定&#…

echarts条形图动态显示

1、实现效果 每次展示5个,轮流展示 2、实现思路 使用datazoom,一次展示5项数据,轮流展示每2s刷新一次。 条形图有两个柱子,一个蓝色柱子,一个灰色柱子,两个柱子重合,且蓝柱子在上面。 为了使左侧的类目和柱…

【ubuntu重装系统后的软件配置_memo】

重装系统后系统环境恢复 备份安装系统常用的一些debvscode 更改sourcespip加速爬长城的家伙式儿安装ROS安装cmake安装git安装zsh顺便开个ssh提升幸福感的映射配置neovimplugins字体插件遇到的问题 锁键盘/鼠标小玩意儿 备份 实验时不起眼的图顺手写的脚本忘记从哪儿下载的资源…

华为云命令行工具服务KooCLI助力一键管理云资源

对于CLI即命令行工具,运维同学可能并不陌生,它摒弃了对图形化界面的需求,不再拘泥于可视化的页面切换、按钮点击等操作,反而为用户提供了一个便捷且高控制的解决方案,使用户在日常的运维工作中,用一行命令即…

【深度学习】目标检测的全面回顾

一、说明 随着自动驾驶汽车、智能视频监控、面部检测和各种人数统计应用的兴起,对快速准确的物体检测系统的需求也在不断增长。这些系统不仅涉及识别和分类图像中的每个对象,还涉及通过在图像周围绘制适当的边界框来定位每个对象。这使得对象检测比其传统…

凸包检测、直线检测、点集拟合、二维码检测

目录 1、凸包检测 2、直线检测 3、点集拟合 4、二维码检测 1、凸包检测 //凸包检测 int test1() {Mat img imread("F:/testMap/hand.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}// 二值化Mat gray,…

Splashtop 亮相上安会,助力企业安全远程办公

2023年7月5-7日&#xff0c;2023第二届上海网络安全博览会暨高峰论坛在上海新国际博览中心举办。 本届上安会由上海市信息网络安全管理协会等单位主办&#xff0c;上海科学院、上海汽车集团等机构联合协办。大会围绕数字发展主题&#xff0c;多方位展示了网络安全行业的最新发…

SQL性能规范

一、随聊 记录一下吧&#xff0c;2023年7月13日00:11:11&#xff0c;现在的状态真的很&#xff0c;忙&#xff0c;干不完的活&#xff0c;希望巨大的压力&#xff0c;能够让自己快速成长&#xff0c;回想我这一路&#xff0c;21年大专毕业&#xff0c;用一年时间熟悉软件&…

JDK的安装与配置

所有的开发&#xff0c;第一步必然是准备环境&#xff0c;而JDK提供了一套完整的工具和环境&#xff0c;使开发人员能够编写、编译和运行Java应用程序。是Java开发的基础&#xff0c;为开发者提供了丰富的功能和工具&#xff0c;简化了Java应用程序开发的过程。所以这里就记录一…

C++教程——vector容器、deque容器、stack容器、queue容器、list容器、set容器、map容器

vector容器 基本概念 vector赋值操作 vector容量和大小 vector插入与删除 vector数据存取 vector互换容器 vector预留空间&#xff1a;减少开辟内存空间的次数 deque容器 deque构造函数 deque赋值方式 deque大小操作 deque插入和删除 deque数据存取 deque排序 stack容器 stack…

iOS开发 - 系统自带框架实现扫一扫功能

iOS 扫一扫 利用系统自带框架实现扫一扫功能 一 项目配置 扫一扫功能相机和相册权限&#xff0c;在info.plist中设置询问用户是否允许访问的权限。 info.plist加入NSCameraUsageDescription、NSPhotoLibraryUsageDescription、NSPhotoLibraryAddUsageDescription <key&g…

java.lang.UnsatisfiedLinkError: Could not load SWT library.

java.lang.UnsatisfiedLinkError: Could not load SWT library. https://download.eclipse.org/windowbuilder/lastgoodbuild