Você está na página 1de 10

Iniciando

Bibliotecas e gdrive

Abaixo, adicionamos as bibliotecas.

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

Em seguida, é montado o GoogleDrive para acesso as imagens

from google.colab import drive
drive.mount('/content/drive')

Drive already mounted at /content/drive; to attempt to forcibly remount, ca

Carregando as imagens no formato PGM


A imagem está no formato PGM. A função readpgm() recebe o arquivo,
descarta os comentários, verificar se o formato é ASCII e converte as
informações restantes (níveis de cinza da imagem, dimensões e brilho
máximo) no vetor data[], sendo retornado três fragmentos desse vetor,
o primeiro referente aos níveis de cinza da imagem, o outro com as
dimensões da imagem (256 x 256) e outro com o valor de intensidade
máxima (255).

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])

Abaixo, carregamos as imagens na função readpgm(), que retorna o


nível do brilho de cada pixel da imagem, as dimensões da imagem e o
valor máximo do brilho.

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")

Se uma imagem no formato .PGM for aberta com editor de texto,


veremos as seguintes linhas (as primeiras linhas apenas)

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

...

Em seguida, vemos os níveis de cinza de uma das imagens ....

print(np.reshape(airplane[0],airplane[1]))

[[ 63 194 183 ... 177 170 161]

[ 57 194 197 ... 220 210 165]

[ 61 178 182 ... 197 218 201]

...

[ 84 222 213 ... 154 196 193]

[ 95 209 213 ... 143 169 194]

[ 80 221 201 ... 137 146 183]]

Vizualizando as imagens ....

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>

Histograma dos níveis de brilho de cada imagem


(img_freq_r)
Na horizontal temos os 256 nívels de brilho da imagem e na vertical a
frequência ou número de vezes que este ocorre na imagem.

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.

A função infor_nivel() retorna a informação, em bits, de cada nível de brilho da


imagem (níveis com frequência zero é atribuído 'inf' (infinito))

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)

<BarContainer object of 256 artists>

boat.pgm

boat_infor_nivel = infor_nivel(boat_freq, 256, 256);
plt.bar(range(0,256),boat_infor_nivel)

<BarContainer object of 256 artists>


frog.pgm

frog_infor_nivel = infor_nivel(frog_freq, 256, 256);
plt.bar(range(0,256),frog_infor_nivel)

<BarContainer object of 256 artists>

Informação total das imagens (img_info_tt)


A informação total é o somatório do produto entre a frequencia relativa
de cada nível de brilho (m) e informação de cada nível de brilho (p(xi)).
Aplicando infor_img(img_infor_nivel, img_freq_r) é retornado o valor da
informação total em Kbits.

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

barbara.pgm (mais informação)


barbara_infor_tt = infor_img(barbara_infor_nivel, barbara_freq)
print("%.2f Kb" % barbara_infor_tt)

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.pgm (menos informação)

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

check 0s conclusão: 13:21

Você também pode gostar