Python灰度变换中位图切割分析实现

目录
  • 1. 介绍
  • 2. 实现方法
  • 3. code
  • 4. 比特平面重建图像

1. 介绍

图像的像素值是由比特组成的。例如一副256级灰度图像中,图像是由8 bit组成。

与之前对比度拉伸的区别是,之前我们主要强调在某一范围的灰度值作为我们能感兴趣的目标将其变亮或者变暗。而位图切割主要强调每个bit对图像的贡献,通过方法将不同位的灰度值值取出来还原成图像。

如图所示,一副8 bit图像,我们可以将图像分割成8个,将每个图像对应的比特位取出构建成一副新的图像

2. 实现方法

例如图像某一点的像素值为100,对应的二进制为0110 0100

我们的目标很简单,就是将第1位的0取出来(这里不要把100看成一个数,将他想象成一幅图像的所有点,我们要把图像像素对应二进制的第一位全部取出,组成一副新的图像)以此类推...

最后为了防止取出的灰度值过暗,我们将他映射到最大值255

这里提供两种方法实现:

  • 将图像的二进制和对应的 8bit 相与(0000 0000),例如取第0个比特平面的话图像就和(0000 0001)与。所以结果只能是0000 000X (X取决于图像的最低位),如果X = 1的话,我们认为这个点的像素在 0bit平面有值,将它映射为255;否则为0
  • 图像像素除以 2^n (n代表第n个比特平面,n从0开始,为了满足编程下标从0开始计数),如果商的整数部分为1的话,说明这个点在n比特平面有值,映射为255;否则为0

注:

  • 这里映射为255为了突出对应比特平面的亮度,否则就算再最高的比特平面,最大值也只有128灰度值(因为最高的是第7为,2^7 = 128)
  • 如果利用第一种与的方法,但是最后不要拉伸成255,只是把与的结果作为新的图像输出。那么只需要将8副图像全部加起来就可以还原图像

3. code

这里用第二种÷的方法实现

如果用第一种与的方法的话,只需要将中间的代码段替换成后面的就行,结果是一样的

import cv2
import numpy as np
gray = cv2.imread('./img.jpg',0)
img = cv2.resize(gray,None,fx = 0.5,fy = 0.5,interpolation=cv2.INTER_AREA)  #缩小图像
group = []   # 存放每一层的图像
for n in range(8):
    dst = np.zeros_like(img)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            ret = img[i][j] // pow(2,n)       #ret = img[i][j] & pow(2,n)
            if (ret % 2) ==1:                 # if (ret ==pow(2,n)):
                dst[i][j] = 255
            else:
                dst[i][j] = 0
    group.append(dst)
cv2.imshow('0-3',np.hstack((i for i in group[:4])))
cv2.imshow('4-7',np.hstack((i for i in group[4:])))
cv2.waitKey()
cv2.destroyAllWindows()

输入图像:

输出结果:

4. 比特平面重建图像

如果还原图像的话,我们再输出图像的时候,就不要映射到255,之间将图像与比特平面相与的结果输出即可

import cv2
import numpy as np
gray = cv2.imread('./img.jpg',0)
img = cv2.resize(gray,None,fx = 0.5,fy = 0.5,interpolation=cv2.INTER_AREA)  #缩小图像
group = []   # 存放每一层的图像
for n in range(8):
    dst = np.zeros_like(img)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            ret = img[i][j] & pow(2,n)
            dst[i][j] = ret   # 将与的结果作为图像
    group.append(dst)
cv2.imshow('0-3',np.hstack((i for i in group[:4])))
cv2.imshow('4-7',np.hstack((i for i in group[4:])))
a = np.zeros_like(img)   # 还原
for i in group:
    a += i
cv2.imshow('img',a)
cv2.waitKey()
cv2.destroyAllWindows()

输出比特平面:

所以图像相加为:

到此这篇关于Python灰度变换中位图切割分析实现的文章就介绍到这了,更多相关Python位图切割内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python灰度变换中的对数变换专项分析实现

    目录 1. 原理 2. 代码 1. 原理 对数变换的公式为: 其中:c是伸缩系数,常设为1.src为输入的原图像,dst为经过对数变换的输出图像 对数变换的曲线为: 由曲线的形状可以发现,对数变换将输入中范围较窄的低灰度值映射为输出中灰度值较宽的部分.也就是对数变换可以提升原图中暗区的对比度,同时可以压缩明亮区的对比度. 反对数变换的效果刚好相反 2. 代码 import numpy as np import cv2 def log(x): y =np.log(1+x) ym = y- y.mi

  • Python灰度变换中的分段线性函数专项分析实现

    目录 1. 分段线性函数介绍 2. 代码实现 3. other 1. 分段线性函数介绍 分段线性函数同样是点运算,基于像素的图像增强,也就是对比度拉伸. 大概的原理就是:将不同灰度区间的灰度值经过不同的映射函数映射到另一个灰度区间的过程. 因为使用变换函数的个数是三个,所以我们经常使用的分段线性函数是三段线性变换函数 对应的数学公式为 a = 1 ,b = 0 时,恒等函数,不改变图像的灰度值 a >1, 对比度增强 0 < a < 1 , 对比度减弱 b 控制图像的亮度,b >

  • Python图像灰度变换及图像数组操作

    使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理 numpy简介: NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量.矩阵.图像等)以及线性代数函数. 数组对象可以实现数组中重要的操作,比如矩阵乘积.转置.解方程系统.向量乘积和归一化.这为图像变形.对变化进行建模.图像分类.图像聚类等提供了基础. 在上一篇python基本图像操作中,当载入图像时,通过调用 array() 方法将图像转换成NumPy的数组对象

  • Python灰度变换中伽马变换分析实现

    目录 1. 介绍 2. 代码实现 3. 提升视频的亮度 1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形式为: 其中,s为输出的像素点的灰度值,r为输入像素点的灰度值.c . γ 为常数 γ 值不同的时候,对应的变换曲线如图,这里我们不关注具体函数的取值,而只是关注变换曲线的形状 通过观察可以发现 γ > 1 的时候,会压缩暗区的对比度,抬高亮区的对比度.并且γ越大,效果越明显 γ < 1 的时候,会提升暗区的对

  • Python灰度变换中位图切割分析实现

    目录 1. 介绍 2. 实现方法 3. code 4. 比特平面重建图像 1. 介绍 图像的像素值是由比特组成的.例如一副256级灰度图像中,图像是由8 bit组成. 与之前对比度拉伸的区别是,之前我们主要强调在某一范围的灰度值作为我们能感兴趣的目标将其变亮或者变暗.而位图切割主要强调每个bit对图像的贡献,通过方法将不同位的灰度值值取出来还原成图像. 如图所示,一副8 bit图像,我们可以将图像分割成8个,将每个图像对应的比特位取出构建成一副新的图像 2. 实现方法 例如图像某一点的像素值为1

  • Python编程中的反模式实例分析

    本文实例讲述了Python编程中的反模式.分享给大家供大家参考.具体分析如下: Python是时下最热门的编程语言之一了.简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题:丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务的首选:强大而活跃的社区,齐全的文档,也使很多编程的初学者选择了它作为自己的第一门编程语言.甚至有国外的报道称,Python已经成为了美国顶尖大学里最受欢迎的编程入门教学语言. 要学好一门编程语言实属不易,在初学阶段,就

  • python开发中range()函数用法实例分析

    本文实例讲述了python开发中range()函数用法.分享给大家供大家参考,具体如下: python中的range()函数的功能很强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence of numbers, the built-in function range() comes in handy. It generates arithmetic progressions 下面是我做的demo: #

  • python开发中module模块用法实例分析

    本文实例讲述了python开发中module模块用法.分享给大家供大家参考,具体如下: 在python中,我们可以把一些功能模块化,就有一点类似于java中,把一些功能相关或者相同的代码放到一起,这样我们需要用的时候,就可以直接调用了 这样做的好处: 1,只要写好了一个功能模块,就可以在以后调用,代码的重用就可以体现出来了 2,功能写好了以后,不会发生错误.如果一个相同的功能,我们在一个模块中写了一遍,在另外的模块中又写了一遍......这样我们难免保证我们在写的过程中不发生错误. 但是我们如果

  • python pandas中索引函数loc和iloc的区别分析

    目录 前言 1.直接使用行或者列标签 2.loc函数 3.iloc函数 总结 前言 使用pandas进行数据分析的时候,我们经常需要对DataFrame的行或者列进行索引.使用pandas进行索引的方法主要有三种:直接使用行或者列标签.loc函数和iloc函数. 举个简单的例子: import numpy as np import pandas as pd df = pd.DataFrame({"Fruits":["apple","pear",&

  • Python程序中设置HTTP代理

    0x00 前言 大家对HTTP代理应该都非常熟悉,它在很多方面都有着极为广泛的应用.HTTP代理分为正向代理和反向代理两种,后者一般用于将防火墙后面的服务提供给用户访问或者进行负载均衡,典型的有Nginx.HAProxy等.本文所讨论的是正向代理. HTTP代理最常见的用途是用于网络共享.网络加速和网络限制突破等.此外,HTTP代理也常用于Web应用调试.Android/IOS APP 中所调用的Web API监控和分析,目前的知名软件有Fiddler.Charles.Burp Suite和mi

  • Python数据可视化正态分布简单分析及实现代码

    Python说来简单也简单,但是也不简单,尤其是再跟高数结合起来的时候... 正态分布(Normaldistribution),也称"常态分布",又名高斯分布(Gaussiandistribution),最早由A.棣莫弗在求二项分布的渐近公式中得到.C.F.高斯在研究测量误差时从另一个角度导出了它.P.S.拉普拉斯和高斯研究了它的性质.是一个在数学.物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力. 正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人

随机推荐