利用python分析RGB图像及YUV图像三个通道的概率分布并求其熵

数据压缩作业 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.867.187.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.335.134.11

三.分析

根据信息论知识得出,均匀分布的熵最大。RGB图像三通道概率分布以及YUV图像Y通道的灰度值概率分布相比较YUV图像U通道及V通道概率值分布更接近均匀分布,所以求出的熵更大。
同样的一张照片,由RGB格式转为YUV格式,改变了一些通道的概率分布,降低了熵值,就是对于图像数据的压缩处理。

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值