一:比特图像分层
常见的256级灰度图片中,每个像素灰度值由8个比特组成,分别将这8个比特分离,形成8幅新的图片,称为比特图像分层。
举个🌰:
有一副四个像素(2*2)的图像,像素值分别为1,2,3,4:
这些值转换为二进制为(扩充为8位):1(00000001)2(00000010)3(00000011)4(00000100)
则这幅图像的8个比特层图像为:
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位,将其转换回十进制,则其值为,那么使用某几层比特层进行重构,就将这几层的像素值转换回十进制后加起来。
重构函数如下:
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')
左侧为重构图像,右侧为原图像