【数据压缩】RGB文件三通道分量的熵计算

该博客介绍了一种使用Python计算RGB图像各通道灰度值概率分布及其熵的方法。首先验证了test.rgb文件的大小,然后通过numpy和matplotlib库读取和显示图像,接着统计每个通道的灰度值频率并绘制概率分布图。最后,计算并输出了BGR三通道的熵,分别为6.856861217、7.178556717和7.22965147。
摘要由CSDN通过智能技术生成

一、题目设置及准备工作

test.rgb文件分辨率为256*256,数据格式为每个像素占用3字节,BGRBGR…保存。拿到文件可以先计算一下文件大小是否为宽×高×3字节。
要求计算rgb文件三通道分量的熵。
验证:在python中将test.rgb文件读入,并取出数据,检测数据变量rgb的大小。代码如下:

fp=open("test.rgb","rb")
rgb=fp.read()
fp.close()

rgb的大小显示如下:
在这里插入图片描述
196608=256×256×3,验证得文件大小为宽×高×3字节。
本实验用pycharm环境、python语言实现。

二、代码实现

1、引入库

import numpy as np
import matplotlib.pyplot as plt
import math

2、读入rgb文件并提取数据

fp=open("test.rgb","rb")
rgb=fp.read()
fp.close()
w,h=256,256
rgb=[int(x) for x in rgb]
rgb=np.array(rgb).reshape((w,h,3))

3、显示原始图像

plt.figure(1)
plt.imshow(rgb)

在这里插入图片描述

4、统计求出BGR三通道分量的灰度值概率分布并绘图

p=np.zeros(256)
for k in range(3):
    for j in range(h):
        for i in range(w):
            p[rgb[i][j][k]]+=1

    for i in range(256):
        p[i]=p[i]/(w*h)
    x=np.linspace(0,255,256)
    if k==0:
        plt.figure(2)
        plt.plot(x,p,'b')
    elif k==1:
        plt.figure(2)
        plt.plot(x,p,'g')
    else:
        plt.figure(2)
        plt.plot(x,p,'r')
        
plt.legend(['Blue B','Green G','Red R'])
plt.xlabel('gray value')
plt.ylabel('probability')
plt.show()

概率图如下:
在这里插入图片描述

5、求出BGR三通道分量的熵

for k in range(3):
	    for i in range(256):
        	if p[i]!=0:
            	entropy[k]-=p[i]*math.log2(p[i])
print(entropy)

结果如下(依次为B、G、R通道的熵):

[6.85686121 7.17855671 7.22965147]

三、完整代码

import numpy as np
import matplotlib.pyplot as plt
import math
fp=open("test.rgb","rb")
rgb=fp.read()
fp.close()
w,h=256,256
rgb=[int(x) for x in rgb]
rgb=np.array(rgb).reshape((w,h,3))
plt.figure(1)
plt.imshow(rgb)

entropy=np.zeros(3)
p=np.zeros(256)
for k in range(3):
    for j in range(h):
        for i in range(w):
            p[rgb[i][j][k]]+=1

    for i in range(256):
        p[i]=p[i]/(w*h)
    x=np.linspace(0,255,256)
    if k==0:
        plt.figure(2)
        plt.plot(x,p,'b')
    elif k==1:
        plt.figure(2)
        plt.plot(x,p,'g')
    else:
        plt.figure(2)
        plt.plot(x,p,'r')
    for i in range(256):
        if p[i]!=0:
            entropy[k]-=p[i]*math.log2(p[i])
print(entropy)
plt.legend(['Blue B','Green G','Red R'])
plt.xlabel('gray value')
plt.ylabel('probability')
plt.show()

参考

Python绘图|Python绘制多曲线图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值