数据压缩作业 03.04
分析对象:down.rgb down.yuv
已知:分辨率 256*256 yuv是 4:2:0 采样空间 rgb文件按每个像素BGR分量依次存放,yuv格式按照全部像素的Y数据块、U数据块、V数据块依次存放
一.对于RGB图像
1.引入库
import cv2 as cv
import numpy as np
import math
import matplotlib.pyplot as plt
2.读取rgb文件,并依次提取出其中bgr信息
f = open("down.rgb", "rb")
data = f.read()
f.close()
data = [int(x) for x in data]
data_B=[]
data_G=[]
data_R=[]
for i in range(1, 256*256*3+1): # 总数为256*256*3
if(divmod(i-1,3)[1]==0):
data_B.append(data[i-1])
if (divmod(i-1, 3)[1] == 1):
data_G.append(data[i-1])
if (divmod(i-1, 3)[1] == 2):
data_R.append(data[i-1])
3.统计并求出BGR数组中灰度值概率分布并绘图
count_B=np.zeros(255)
count_G=np.zeros(255)
count_R=np.zeros(255)
for i in data_B:
count_B[i-1]=count_B[i-1]+1
for i in data_G:
count_G[i-1]=count_G[i-1]+1
for i in data_R:
count_R[i-1]=count_R[i-1]+1
for i in range(1,256):
count_B[i - 1] = count_B[i - 1] / 65536
count_G[i - 1] = count_G[i - 1] / 65536
count_R[i - 1] = count_R[i - 1] / 65536
plt.plot(count_B,'b')
plt.plot(count_G,'g')
plt.plot(count_R,'r')
plt.legend(['B','G','R'])
plt.show()
所求得BGR灰度值概率分布图如下:
4.求出BGR各通道的熵
H_B=0
H_G=0
H_R=0
for i in range(1,256):
if(count_B[i - 1]==0):
H_B = H_B + 0
else:
H_B = H_B + count_B[i - 1] * math.log2(count_B[i - 1])
if (count_G[i - 1] == 0):
H_G = H_G + 0
else:
H_G = H_G + count_G[i - 1] * math.log2(count_G[i - 1])
if (count_R[i - 1] == 0):
H_R = H_R + 0
else:
H_R = H_R + count_R[i - 1] * math.log2(count_R[i - 1])
H_B=-H_B
H_G=-H_G
H_R=-H_R
print(H_B,H_R,H_G)
H(Blue) | H(Green) | H (Red) |
---|---|---|
6.86 | 7.18 | 7.23 |
二.对于YUV图像
由于求解过程类似,所以在这就不列出文字过程,只列出代码部分和结果
import numpy as np
import math
import matplotlib.pyplot as plt
f = open("down.yuv", "rb")
data = f.read()
f.close()
data = [int(x) for x in data]
# Y U V
data_Y=[]
data_U=[]
data_V=[]
for i in range(1,256*256+1):
data_Y.append(data[i-1])
for i in range(256*256+1,81920+1):
data_U.append(data[i-1])
for i in range(81920+1,98304+1):
data_V.append(data[i-1])
count_Y=np.zeros(255)
count_U=np.zeros(255)
count_V=np.zeros(255)
for i in data_Y:
count_Y[i-1]=count_Y[i-1]+1
for i in data_U:
count_U[i-1]=count_U[i-1]+1
for i in data_V:
count_V[i-1]=count_V[i-1]+1
for i in range(1,256):
count_Y[i - 1] = count_Y[i - 1] / 65536
count_U[i - 1] = count_U[i - 1] / 16384
count_V[i - 1] = count_V[i - 1] / 16384
plt.plot(count_Y)
plt.plot(count_U)
plt.plot(count_V)
plt.legend(['Y','U','V'])
plt.show()
H_Y=0
H_U=0
H_V=0
for i in range(1,256):
if(count_Y[i - 1]==0):
H_Y = H_Y + 0
else:
H_Y = H_Y + count_Y[i - 1] * math.log2(count_Y[i - 1])
if (count_U[i - 1] == 0):
H_U = H_U + 0
else:
H_U = H_U + count_U[i - 1] * math.log2(count_U[i - 1])
if (count_V[i - 1] == 0):
H_V = H_V + 0
else:
H_V = H_V + count_V[i - 1] * math.log2(count_V[i - 1])
H_Y=-H_Y
H_U=-H_U
H_V=-H_V
print(H_Y,H_U,H_V)
所求得YUV灰度值概率分布图如下:
H(Y) | H(U) | H (V) |
---|---|---|
6.33 | 5.13 | 4.11 |
三.分析
根据信息论知识得出,均匀分布的熵最大。RGB图像三通道概率分布以及YUV图像Y通道的灰度值概率分布相比较YUV图像U通道及V通道概率值分布更接近均匀分布,所以求出的熵更大。
同样的一张照片,由RGB格式转为YUV格式,改变了一些通道的概率分布,降低了熵值,就是对于图像数据的压缩处理。