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

一、比特平面分层

像素是由比特组成的数字。例如在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 pixelplt.rcParams['figure.figsize'] = (10, 3.6)fig, a = plt.subplots(2, 4)m = 0n = 8for 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 += 1n -= 1fig.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 pixelplt.rcParams['figure.figsize'] = (10, 3.6)fig, a = plt.subplots(2, 4)m = 0n = 8for 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 += 1n -= 1fig.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_imgdef 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.hqwc.cn/news/14488.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目多模块打包部署Docker实战

前言 我们好多程序员都只关注功能代码的编写,在一些运维工作上则显得略有不足。这篇文章通过介绍最常见的Maven管理的Spring Boot项目多模块打包部署Docker来介绍一下项目部署过程中操作流程和几个需要注意的点。文章假设读者有前面提到的技术点的前置知识&#xf…

3D建模软件、Creo 3D 、Creo8安装、下载教程

PTC Creo 8.0 是一款三维 CAD 软件,适用于多个行业和应用场景,包括机械设计、工业设计、电子设计等等。以下是 PTC Creo 8.0 的功能介绍和安装条件: 功能介绍: 三维建模:可以使用多种工具进行三维建模,包…

ModaHub魔搭社区:RESTful API 的方式访问全球领先的向量数据库Milvus

目录 Insert CreateIndex and Load Search or Query 作为全球领先的开源向量数据库,Milvus 一直致力于满足不同用户的场景和需求,聆听社区的声音。 最近, 我们发现,很多用户的数据中 常常包含各种不确定类型的数据,也有用户提出希望以 RESTful API 的方式访问 Milvus。…

Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘

Python 有趣的模块之pynupt ——通过pynput控制鼠标和键盘 文章目录 Python 有趣的模块之pynupt ——通过pynput控制鼠标和键盘1️⃣简介2️⃣鼠标控制与移动3️⃣键盘控制与输入4️⃣结语📢 1️⃣简介 🚀🚀🚀学会控制鼠标和键盘是…

基于Unity2017版本的2D3D Infinite Runner Engine 1.5.1二维三维跑酷游戏模板

基于Unity2017版本的2D3D Infinite Runner Engine 1.5.1二维三维跑酷游戏模板 有多种游戏模式 还有个竖屏的玩法 工程地址:https://download.csdn.net/download/Highning0007/88020755

axure可视化大屏模板200例 •axure模板 大屏可视化 •axure数据可视化原型 •axure可视化组件 •axure

可视化axure原型可视化大屏模板200例,带动画效果,可直接复用 axure可视化大屏模板200例 axure可视化大屏模板200例数据可视化原型可视化组件下载—无极低码 axure模板 大屏可视化axure数据可视化原型axure可视化组件axure原型演示axure绘制界面原型图…

IDEA中配置Java反编译工具javap -c

IDEA中配置Java反编译工具javap -c 一、前置条件二、新建外部工具三、使用方式 欢迎访问我的个人博客:https://wk-blog.vip 一、前置条件 确保 IDEA 已经开启了编译 javac 。默认 IDEA 是开启的。 二、新建外部工具 首先进入 Settings ---> Tools ---> Ext…

基于“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用

查看原文>>>基于“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用 本文集成云端、桌面端等环境,结合遥感云计算、GIS空间分析,R语言统计分析的优势,以分析生态环境脆弱性…

Spring MVC教程

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集…

【C语言】你知道浮点数是怎么存储的吗?

前言 🎈大家好,我是何小侠🎈 🍃大家可以叫我小何或者小侠🍃 💐希望能通过写博客加深自己对于学习内容的理解💐 🌸也能帮助更多人理解和学习🌸 积学以储宝,酌…

1.Git使用技巧-基础原理

Git 使用技巧 文章目录 Git 使用技巧前言一、Git 安装二、搭建服务端仓库三、搭建客户端1. git 通信2. git支持的通信协议本地拉取代码3. 配置用户名和密码查看配置 查看git 帮助Git 工作流程总结参考 前言 Git 是一个开源的分布式代码版本控制系统,用于敏捷高效地…

springboot---定时任务实现

定时任务 1. scheduled注解实现1.1. 用法1.2. 参数详解1.2.1. cron1.2.2. zone1.2.3. fixedDelay1.2.4. fixedDelayString1.2.5. fixedRate1.2.6. fixedRateString1.2.7. initialDelay1.2.8. initialDelayString 1.3. 示例 1. scheduled注解实现 1.1. 用法 任意类中创建一个方…