一、题目设置及准备工作
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通道的熵):
三、完整代码
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()