Escolar Documentos
Profissional Documentos
Cultura Documentos
Bibliotecas e gdrive
import numpy as np
import matplotlib.pyplot as plt
import math
from google.colab import drive
drive.mount('/content/drive')
https://www.programmersought.com/article/85074087552/
https://www.delftstack.com/pt/howto/matplotlib/matplotlib-imread-in-python/
def readpgm(name):
# Read picture
with open(name) as f:
lines = f.readlines()
# Ignores commented lines
for l in list(lines):
if l[0] == '#':
lines remove(l)
lines.remove(l)
# Makes sure it is ASCII format (P2)
assert lines[0].strip() == 'P2'
# Converts data to a list of integers
data = []
for line in lines[1:]:
data.extend([int(c) for c in line.split()]) # Read data
return (np.array(data[3:]),(data[1],data[0]),data[2])
airplane = readpgm("/content/drive/MyDrive/Colab Notebooks/airplane.pgm")
barbara = readpgm("/content/drive/MyDrive/Colab Notebooks/barbara.pgm")
boat = readpgm("/content/drive/MyDrive/Colab Notebooks/boat.pgm")
frog = readpgm("/content/drive/MyDrive/Colab Notebooks/frog.pgm")
with open("/content/drive/MyDrive/Colab Notebooks/airplane.pgm", 'r') as file:
for i in range(8):
print(file.readline());
print("...");
P2
256 256
255
63 194 183 190 190 199 194 199 194 200 196 194 190 184 175 173 162
168 167 164 171 170 171 174 167 167 166 163 161 161 163 160 158 161
166 172 173 177 178 174 165 171 174 170 168 174 176 168 169 168 166
164 162 166 165 157 160 167 170 171 170 172 174 176 170 171 170 168
171 167 165 168 179 176 177 176 175 171 168 168 165 162 176 184 183
...
print(np.reshape(airplane[0],airplane[1]))
...
plt.subplot(141); plt.imshow(np.reshape(airplane[0],airplane[1]), cmap='gray')
plt.subplot(142); plt.imshow(np.reshape(barbara[0],barbara[1]), cmap='gray')
plt.subplot(143); plt.imshow(np.reshape(boat[0],boat[1]), cmap='gray')
plt.subplot(144); plt.imshow(np.reshape(frog[0],frog[1]), cmap='gray')
<matplotlib.image.AxesImage at 0x7f0814988d50>
airplane.pgm
Para a imagem Airplane, brilhos maiores (acima do nível 180) são mais frequentes na
imagem, devido ao seu fundo branco. Linhas brancas representam ausência do nível
de brilho em questão, na imagem.
airplane_freq,b,c=plt.hist(airplane[0], airplane[2]+1, facecolor='black')
barbara.pgm
Já na imagem Barbara, temos uma melhor distribuição dos níveis de brilho, com
quatro regiões de pico bem distribuído ao longo dos 256 níveis. Novamente, as faixas
brancas representam ausência deste nível de brilho, na composição da imagem.
barbara_freq,b,c=plt.hist(barbara[0], barbara[2]+1, facecolor='black')
boat.pgm
Com distribuição muito idêntica a da imagem Airplane, a imagem Boat possui uma
concentração de frequência para níveis de brilho próximos à 150, devido ao mar e
céu presentes na imagem. Com poucas faixas brancas, vemos que é raro encontrar
níveis de brilho que não estão presentes na imagem, devido ao suave gradiente de
brilho do mar e do céu.
boat_freq,b,c=plt.hist(boat[0], boat[2]+1, facecolor='black')
frog.pgm
Já na imagem Frog, vemos que poucos níveis de brilho estão presentes na imagem,
sendo concentrado a uma dezena de níveis.
frog_freq,b,c=plt.hist(frog[0], frog[2]+1, facecolor='black')
Abaixo, vemos o vetor do histograma com a frequência dos nívels de brilho das
imagens apresentadas acima.
airplane_freq;
barbara_freq;
boat_freq;
frog_freq;
Informação dos nívels de brilho de cada imagem
(img_infor_nivel)
A informação de cada nível de cinza, depende da sua probabilidade de
ocorrência na imagem e segundo a lei dos grandes números, podemos
aproxima este pela frequência relativa. Aplicando infor_nivel() às
imagens, podemos visualizar a informação (bits) de cada nível de
brilho para cada imagem.
def infor_nivel(img_freq, w_img, h_img):
img_infor_nivel=[] # vai conter a informação de cada nível
for i in range(0,len(img_freq)): # Calculamos a informação de cada um dos 256 n
if img_freq[i]==0: # Caso freq nula, infor infinita
img_infor_nivel.append(math.inf);
continue
img_infor_nivel.append(-math.log2(img_freq[i]/(w_img*h_img))) # calculamos a
return img_infor_nivel;
Podemos plotar a informação, eixo vertical em bits, eixo horizontal temos os níveis
de brilho.
airplane.pgm
airplane_infor_nivel = infor_nivel(airplane_freq, 256, 256);
plt.bar(range(0,256),airplane_infor_nivel)
<BarContainer object of 256 artists>
barbara.pgm
barbara_infor_nivel = infor_nivel(barbara_freq, 256, 256);
plt.bar(range(0,256),barbara_infor_nivel)
boat.pgm
boat_infor_nivel = infor_nivel(boat_freq, 256, 256);
plt.bar(range(0,256),boat_infor_nivel)
frog_infor_nivel = infor_nivel(frog_freq, 256, 256);
plt.bar(range(0,256),frog_infor_nivel)
def infor_img(img_infor_nivel, img_freq):
img_info_tt=0; # armazena o tamanho da informação da imagem em bits
for i in range(0,256):
if img_infor_nivel[i] != math.inf: # se não for informação infinita
img_info_tt += img_infor_nivel[i] * img_freq[i] # somatório (informação * f
return img_info_tt/1024; # Informação em Kb.
airplane.pgm
airplane_infor_tt = infor_img(airplane_infor_nivel, airplane_freq)
print("%.2f Kb" % airplane_infor_tt)
430.11 Kb
488.43 Kb
boat.pgm
boat_infor_tt = infor_img(boat_infor_nivel, boat_freq)
print("%.2f Kb" % boat_infor_tt)
460.12 Kb
frog_infor_tt = infor_img(frog_infor_nivel, frog_freq)
print("%.2f Kb" % frog_infor_tt)
318.47 Kb
Entropia (img_entropia_tt)
Somatório do produto da probabilidade (frequência relativa) pela
informação.
def entropia_img(img_infor_nivel, img_freq, w_img, h_img):
img_entropia_tt=0; # armazena o tamanho da informação da imagem em bits
for i in range(0,256):
if img_infor_nivel[i] != math.inf: # se não for informação infinita
img_entropia_tt += img_infor_nivel[i] * (img_freq[i]/(w_img*h_img)) # Somat
return img_entropia_tt; # Entropia em bits/símbolo.
airplane.pgm
airplane_entropia = entropia_img(airplane_infor_nivel, airplane_freq, 256, 256)
print("%.2f bits/símbolo" % airplane_entropia)
6.72 bits/símbolo
barbara.pgm
barbara_entropia = entropia_img(barbara_infor_nivel, barbara_freq, 256, 256)
print("%.2f bits/símbolo" % barbara_entropia)
7.63 bits/símbolo
boat.pgm
boat_entropia = entropia_img(boat_infor_nivel, boat_freq, 256, 256)
print("%.2f bits/símbolo" % boat_entropia)
7.19 bits/símbolo
frog.pgm
frog_entropia = entropia_img(frog_infor_nivel, frog_freq, 256, 256)
print("%.2f bits/símbolo" % frog_entropia)
4.98 bits/símbolo