数字图像处理——比特图像分层与重构

一:比特图像分层

常见的256级灰度图片中,每个像素灰度值由8个比特组成,分别将这8个比特分离,形成8幅新的图片,称为比特图像分层。

举个🌰:

有一副四个像素(2*2)的图像,像素值分别为1,2,3,4:

                                                                                       \begin{bmatrix} 1 & 2\\ 3& 4 \end{bmatrix}

 这些值转换为二进制为(扩充为8位):1(00000001)2(00000010)3(00000011)4(00000100)

则这幅图像的8个比特层图像为:

                                                \begin{bmatrix} 0 &0 \\ 0& 0 \end{bmatrix}\begin{bmatrix} 0 & 0\\ 0& 0 \end{bmatrix}\begin{bmatrix} 0 &0 \\ 0& 0 \end{bmatrix}\begin{bmatrix} 0 &0 \\ 0& 0 \end{bmatrix}\begin{bmatrix} 0 &0 \\ 0& 0 \end{bmatrix}\begin{bmatrix} 0 &0 \\ 0& 1 \end{bmatrix}\begin{bmatrix} 0 &1 \\ 1& 0 \end{bmatrix}\begin{bmatrix} 1 &0 \\ 1& 0 \end{bmatrix}

Python实现过程如下:

 我使用的图片资源不是.jpg无法上传,相关资源可以从这里下载:

https://download.csdn.net/download/hax001/10740733

下图为一样例图,并非实验图:

 读取图片数据:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

img = Image.open('Fig0314(a)(100-dollars).tif')

 定义分层函数:

def logarithm_transformation(img, func, n):
    img_data = np.array(img)
    a = np.shape(img_data)
    new_img = [[] for _ in range(a[0])]
    for i in range(a[0]):
        for j in range(a[1]):
            data = img_data[i][j]
            new_data = func(data, n)
            new_img[i].append(new_data)
    return new_img
def power_law1(data, n):
    x = bin(data)[2:]
    x = '0' * (8 - len(x)) + x
    x = x[::-1]
    a = x[n]
    new_data = int(a)
    return new_data

 调用函数,并可视化结果:

img_list = []
for i in range(8):
    a = logarithm_transformation(img, power_law1, i)
    img_list.append(a)
img_list.append(img)

for i in range(3):
    for j in range(3):
        plt.subplot(3, 3, i*3+j+1)
        plt.axis('off')
        plt.imshow(img_list[i*3+j], cmap='gray')
plt.show()

结果如下(比特层数递增,最后一张是原图):

 

 

二:比特图像重构 

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

重构函数如下:

def rebuild(img_list, build_list):
    new_img = np.array(img_list[0]) * 0
    for i in build_list:
        new_img += np.array(img_list[i]) * (2 ** (i))
    return new_img

 调用函数,并可视化结果(使用6,7层进行重构):

new_img = rebuild(img_list, [6,7])

plt.figure(figsize=(50,119))
plt.subplot(121)
plt.axis('off')
plt.imshow(new_img, cmap='gray')

plt.subplot(122)
plt.axis('off')
plt.imshow(img, cmap='gray')

左侧为重构图像,右侧为原图像 

 

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫虫(——)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值