【图像处理】——比特平面原理和实现方法(全网较全面,含所有比特位图的分层方法)
目录
一、比特平面
1st比特平面:括号里面的为比特值,前面的是原图像中对应要变为0的像素值
2nd比特平面:
3rd比特平面:
4th比特平面:
5th比特平面:
6th比特平面:
7th比特平面:
8th比特平面:
小结:第i比特平面
简单理解
二、代码实现
MATLAB代码实现
Python实现
比特图重构(重建不理想)
翻了很多博客,都没有将各个比特图说清楚,直到看了数字图像处理才明白真正的方法,因此记下来分享给大家
一、比特平面
根据冈萨雷斯的数字图像处理课本(中文第四版)P85-P86,比特平面分层我的理解是:
一幅8比特的图像,可以看作8个一比特的图像组成
一开始我的理解是简单的阈值函数,但这是完全错误的!
既然8比特图像的灰度级是256,则第一比特平面即将0-127的值映射为0,128-255映射为1。如此,那么第七比特平面0-63的映射为0,然后64-255映射为1。 然后继续推导下去在第2,第3比特进行不下去, 通过课后题答案,发现问题所在。
这是课后习题3.3(a)的答案
1st比特平面:括号里面的为比特值,前面的是原图像中对应要变为0的像素值
这是最低的比特平面,其比特值为:
0、2、4、6、8、10、...、254(0)
1、3、5、7、9、11、...、255(1)
规律:区间长为0,偶数为0,奇数为1,共有2^(8-1+1)=256个区间
2nd比特平面:
比特值为0的像素值:【0,1】【4,5】【8,9】【12,13】。。。【252,253】
比特值为1的像素值:【2,3】【6,7】【10,11】【14,15】。。。【254,255】
规律:闭区间,区间长为2,区间起始点为0或2^2的倍数时比特值为0,其他为1,一个闭区间元素有2^(2-1)=2个,共有2^(8-2+1)=128个区间
3rd比特平面:
比特值为0的像素值:【0,3】【8,11】【16,19】【24,27】.。。。【248,251】
比特值为1的像素值:【4,7】【12,15】【20,23】【28,31】。。。【252,255】
规律:闭区间,区间长为4,区间起始点为0或2^3的倍数时比特值为0,其他为1,一个闭区间元素有2^(3-1)=4个,共有2^(8-3+1)=64个区间
4th比特平面:
比特值为0的像素值:【0,7】【16,23】【32,39】【48,55】.。。。【239,247】
比特值为1的像素值:【8,15】【24,31】【40,47】【56,63】。。。【248,255】
规律:闭区间,区间长为2^(4-1)=8,区间起始点为0或2^4的倍数时比特值为0,其他为1,一个闭区间元素有2^(4-1)=8个,共有2^(8-4+1)=32个区间
5th比特平面:
比特值为0的像素值:【0,15】【32,47】【64,79】【96,111】【128,143】【160,175】【192,207】【224,239】
比特值为1的像素值:【16,31】【48,63】【80,95】【110,127】【144,159】【176,191】【208,221】【240,255】
规律:闭区间,区间长为2^(5-1)=16,区间起始点为0或2^5的倍数时比特值为0,其他为1,一个闭区间元素有2^(5-1)=16个,共有2^(8-5+1)=16个区间
6th比特平面:
比特值为0的像素值:【0,31】【64,95】【128,159】【192,207】
比特值为1的像素值:【31,63】【96,127】【160,191】【208,255】
规律:闭区间,区间长为2^(6-1)=32,区间起始点为0或2^6的倍数时比特值为0,其他为1,一个闭区间元素有2^(6-1)=32个,共有2^(8-6+1)=8个区间
7th比特平面:
比特值为0的像素值:【0,63】【128,191】
比特值为1的像素值:【64,127】【192,255】
规律:闭区间,区间长为2^(7-1)=64,区间起始点为0或2^7的倍数时比特值为0,其他为1,一个闭区间元素有2^(7-1)=64个,共有2^(8-7+1)=4个区间
8th比特平面:
比特值为0的像素值:【0,127】
比特值为1的像素值:【128,255】
规律:闭区间,区间长为2^(8-1)=128,区间起始点为0或2^8的倍数时比特值为0,其他为1,一个闭区间元素有2^(8-1)=128个,共有2^(8-8+1)=2个区间
小结:第i比特平面
闭区间,区间长为2^(i-1),区间起始点为0或2^i的倍数时比特值为0,其他为1,一个闭区间元素有2^(i-1)=128个,共有2^(8-i+1)=2个区间
简单理解
二、代码实现
自己根据上述规律写代码就不写了,大佬写出来了求分享谢谢
MATLAB代码实现
可参考:https://blog.csdn.net/be_solider/article/details/79114263
Python实现
import cv2
import numpy as np
import matplotlib.pyplot as plt#更改为需要的图片路径
img = cv2.imread(r'C:\Users\xxx\Desktop\dollar.tif',0)
h,w = img.shape[0],img.shape[1]#处理过程
new_img = np.zeros((h,w,8))#用于存放每个比特位图,行h列w高8
for i in range(h):for j in range(w):n = str(np.binary_repr(img[i,j],8)) #将图像的灰度值转化为8位二进制数值,并且以str字符串的形式返回for k in range(8):new_img[i,j,k] = n[k]#依次从二进制的高位到低位赋值给new_img中,这样就将一个灰度值用8位的二进制表达出来了#依次显示
for i in range(8):#将比特图从高到低显示出来,从第8比特图从第1比特图cv2.imshow('image',new_img[:,:,i])cv2.waitKey(0)
比特图重构(重建不理想)
重构是使用第n个平面的像素值乘以常数 2^(n-1)
用128乘以比特平面8,用64乘以比特平面7,然后将这两个平面相加,原图的主要特征便被复原了。
import cv2
import numpy as np
import matplotlib.pyplot as plt#获得二进制图三维
def eightBit(img):h,w = img.shape[0],img.shape[1]#处理过程,比特平面分层new_img = np.zeros((h,w,8))#用于存放每个比特位图,行h列w高8for i in range(h):for j in range(w):n = str(np.binary_repr(img[i,j],8)) #将图像的灰度值转化为8位二进制数值,并且以str字符串的形式返回for k in range(8):new_img[i,j,k] = n[k]#依次从二进制的高位到低位赋值给new_img中,这样就将一个灰度值用8位的二进制表达出来了return new_img#依次显示各个层的比特图
def showBitImg(new_img):for i in range(8):#将比特图从高到低显示出来,从第8比特图从第1比特图cv2.imshow('image{}'.format(i),new_img[:,:,i])#这里是三维,1表示白色,0表示黑色cv2.waitKey(0)# ##重建
def reConstruct(new_img,numOfBit):''':param new_img: :param numOfBit:指定前几个高阶比特图的和 :return: 返回叠加图'''h,w,b = new_img.shapereImg = np.zeros((h,w,1))for i in range(numOfBit):#% 对第i比特面的值乘以2 ^ (i - 1)#得到对应十进制的值l = 8 - i - 1temp = new_img[:,:,i]*(2** l)#% 累加比特面reImg = reImg + tempprint(reImg)return reImg[0,:,:]if __name__ == '__main__':# 更改为需要的图片路径img = cv2.imread(r'E:\SCUT_study_files\PYTHON\Image_Processing\colorful_lena.jpg', 0)new_img = eightBit(img)reImg = reConstruct(new_img,4)cv2.imshow('reImg',reImg)cv2.waitKey(0)
【图像处理】——比特平面原理和实现方法(全网较全面,含所有比特位图的分层方法)相关推荐
- 数字图像处理 - 比特平面分层 的python实现
本文主要介绍对<数字图像处理>第三章 比特平面分层 的介绍 p70 对于8位256灰度级图像来说,如果它的每个灰度值用二进制表示,选择将这8个数字用8个字节来表示,如32的二进制表示是00 ...
- 图像处理:比特平面分层
图像处理:比特平面分层 图像的深度 图像由像素构成,每个像素位数据占用位数即图像的深度,单通道(1字节)图像深度为8位对应opencv 8UC1,三通道(3字节)图像对应深度24,8UC3.1位图即二 ...
- 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波6 - 分段线性变换 - 比特平面分层
目录 比特平面分层 比特平面分层 在一幅256级灰度图像中,图像的值是由8比特(1字节)组成的 def convert_bin(data, n):"""convert d ...
- 数字图像处理实验之比特平面分层
其实书本里讲的不是很清楚,我在这里用大白话的形式介绍一个比特平面分层的意思.这里用书中例子,100美元的图像来说明.图像是256级灰度图像,其中一个像素点是由8比特组成的,8比特图像由8个1比特平面组 ...
- python验证数学原理_一起学opencv-python九(性能的测量和优化与图像处理的数学原理)...
图像混合 其实用的就是cv2.addWeighted函数,前面也介绍过这个函数.不过首先得把图片的形状搞成一样的,这个画图可以做到. 接下来是一块比较重要的内容. 性能的测量和优化 参考 https: ...
- 比特平面分层_平面设计中的分层
比特平面分层 One of the first windows to pop up automatically, when I first started using Adobe Photoshop ...
- 【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)
[OpenCV 例程200篇]42. 图像的灰度变换(比特平面分层) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...
- 灰度变换-位图切割(比特平面分层)
目录 1. 介绍 2. 实现方法 3. code 4. 比特平面重建图像 1. 介绍 图像的像素值是由比特组成的.例如一副256级灰度图像中,图像是由8 bit组成. 与之前对比度拉伸的区别是,之前我 ...
- 分段线性变换函数——比特平面分层
1.比特平面分层 比特平面,代替突出灰度级范围,突出特定比特来为整个图像外观做出贡献.(数字图像处理(中卫第3版)) 下面的例子是该书上使用的实例.这里在matlab中进行实现,帮助大家理解,同时请大 ...
最新文章
- 任意排列、组合终极Shell脚本
- 小程序语音识别+php,微信小程序之语音识别(附小程序+服务器源码)
- 组合查询——怎样使用窗口的继承达到事半功倍?
- VS2013(Visual Studio 2013)官方中文旗舰版安装激活方法
- mysql的collation区分大小写设置
- 【Finish】Python Day 2
- hssfworkbook 设置自适应宽度_「CSS很简单」CSS 实现宽高等比自适应容器
- PHP返回数据json数据样式要求是对象{},而不是[]
- Android之获取证书文件(pfx格式)的公钥和私钥
- C#——image与byte数组的转换
- python 线程退出_python线程退出
- linux_iptables 详解
- 最长回文(Manacher算法模板)
- 测试经理如何规范测试团队(测试管理篇)
- tsdb java_OpenTSDB 问题集锦
- Java单例模式简单代码
- 查看服务器阵列卡型号6,怎么查看 dell 阵列卡型号#如何通过服务器自检画面的信息查看当前阵列卡的型号...
- java speex_JAVA版-微信语音.speex转.wav(示例代码)
- java实现fp-growth算法
- Flex 桌面应用 adl 调试模式运行