]> vgcfreebox.myrthtech.pt Git - ue-ccd-compressaodeimagensbinarias.git/blob - calculo_entropia.py
second version delivered to teacher
[ue-ccd-compressaodeimagensbinarias.git] / calculo_entropia.py
1 import math
2 import sys
3
4 def calcular_entropia(bitstream):
5 n = len(bitstream)
6 if n == 0: return 0
7
8 p0 = bitstream.count('0') / n
9 p1 = bitstream.count('1') / n
10
11 entropia = 0
12 for p in [p0, p1]:
13 if p > 0:
14 entropia -= p * math.log2(p)
15 return entropia
16
17 def calcular_entropia_condicional(bitstream):
18 transicoes = {'00': 0, '01': 0, '10': 0, '11': 0}
19 contagem_base = {'0': 0, '1': 0}
20
21 for i in range(len(bitstream) - 1):
22 par = bitstream[i:i+2]
23 transicoes[par] += 1
24 contagem_base[bitstream[i]] += 1
25
26 h_condicional = 0
27 for base in ['0', '1']:
28 p_base = contagem_base[base] / (len(bitstream) - 1)
29 if p_base > 0:
30 h_local = 0
31 for prox in ['0', '1']:
32 p_transicao = transicoes[base + prox] / contagem_base[base]
33 if p_transicao > 0:
34 h_local -= p_transicao * math.log2(p_transicao)
35 h_condicional += p_base * h_local
36
37 return h_condicional
38
39 def clean_image_data(image_data):
40
41 clean_text = ""
42
43 for line in image_data:
44 line = line.strip()
45 line = line.replace(" ", "")
46 if not line or line.startswith('#'):
47 continue
48 clean_text += line
49
50 return clean_text
51
52 with open(sys.argv[1], "r") as image:
53 lines = image.readlines()
54 image_data = clean_image_data(lines[2:])
55
56 h_x = calcular_entropia(image_data)
57 h_condicional = calcular_entropia_condicional(image_data)
58
59 print(f"Entropia: {h_x:.4f} bits/pixel")
60 print(f"Entropia Condicional: {h_condicional:.4f} bits/pixel")