Entropia obrazu

0

Witam
Entropia obrazu... czy znajdzie się tu ktoś kto wie trochę na ten temat ?
Muszę napisać algorytm obliczający entropię obrazu. Jednak nie mam pewności co do poprawności wykonania tego algorytmu.

Entropię opisuje wzór:

entropia= - sum( (prawd.wyst.na obraz.piks.o jasno.na poz.'i') * log2(prawd.wyst.na obraz.piks.o jasno.na poz.'i') )

Jak się wyznacza to - "prawdopodobieństwo wystąpienia na obrazie piksela o jasności na poziomie 'i'" ???

Czy to będzie:

Prawd = (liczba wystąpień wartości) / (całkowita liczba pikseli)

Np. w obrazie mam 234000 pikseli o jasności R 113.
145990 o jasności G 200 i 200000 pikseli o jasności B 250. Obraz ma wielkość 512x512.
Czyli to prawdopodobieństwo np. dla składowej R będzie wynosić: 234000/262144=0.8926.
I tak dla każdej składowej z osobna. Na końcu zsumować i obliczyć entropię wg. wzoru???
Czy to się tak liczy tą entropię ? Czy to wystarczy ?
Bo...
Drugie pytanie.
Gdzieś się natknąłem na dodatkową informacje, że wyliczając entropie trzeba opierać się na maksymalnej i minimalnej jasności piksela występującego w obrazie. Np. Najwięcej pikseli w obrazie bo aż 34500 występuje o jasności 114 - to byłby ten max. Najmniej np 0 o jasności 200. I niby jakoś na podstawie tych danych również liczy się entropię...

Miał ktoś styczność z tym zagadnieniem i potrafiłby opisać prawidłowy sposób wykonania tego algorytmu ?

0

Tak. Dobrze liczysz prawdopodobieństwo. W zasadzie to jest częstotliwość występowania, a nie prawdopodobieństwo.

http://pl.wikipedia.org/wiki/Entropia_(teoria_informacji)

W zadaniu chyba chodzi o obrazy w skali szarości - tam wiadomo co jest jasnością. Jeżeli mamy obraz w RGB to myślę, żeby to rozłożyć na 3 plany i osobno liczyć entropię, a potem zsumować. Czyli tak jak piszesz.

Co do drugiego pytania to to jest całkowicie bez sensu. Nie obchodzi nas jakie mamy wartości, tylko jak często się one pojawiają.

0

nie sumuj entropii dla różnych kolorów. Jeden kolor stanowi opis stanu piksela więc, tak naprawdę. Powinno to wyglądać tak:
S = -\sum_r \sum_g \sum_b p(r,g,b) log_2 p(r,g,b)
gdzie:
p(r,g,b) to prawdopodobieństwo wystąpienia danego koloru (ilość wystąpień danego koloru przez liczbę pikseli).

Jak widać nie da się tego rozbić na sumę entropii poszczególnych kolorów.
Tak naprawdę obraz kolorowy można potraktować (przy liczeniu entropii) jak obraz czarno-biały, gdzie jasność opisywana jest trzykrotnie większą ilością bitów.

0

ok. dzięki za odpowiedź. Jutro postaram się zaimplementować ten algorytm i w razie wątpliwości wrzucę go do ewentualnej kontroli ;)

A jeszcze takie dodatkowe pytanie... A jak to byłoby z wariancją obrazu? Powinienem liczyć dla każdej składowej osobną czy dla wszystkich razem jak w entropii ? A jeśli osobno to czy na końcu słusznie bym zrobił gdy zsumowałbym wyniki wariancji dla R G i B i podzielił je przez 3 ?

I jeszcze jedno. Wiecie coś więcej na temat entropii? Coś czego nie ma w wikipedi. Jakiś opis teoretyczny. "po co?" "dlaczego? "w jakim celu" "co określa wynik i jaki to ma wpływ na obraz?" "jaki z tego morał, że opisuje ona liczbę bitów możliwą do określenia koloru?-bo tego nie rozumiem". Coś żebym zrozumiał sens stosowania tego typu obliczeń a nie tylko wiedział, że można ją zastosować do porównania obrazów...(jeśli w ogóle...)

///////zaimplementowałem algorytm dla wszystkich trzech składowych jednak coś gdzieś robię źle bo wynikiem jest 0 Być może błędnie przypisuje te wartości. I tego minusa nie wiem też gdzie wcisnąć... W pętli czy na końcu.

int i,j,M,N;
float O_entropia,sumR,sumG,sumB;
float r[256], g[256], b[256];
TColor RGB, color;

O_entropia=0;


     M=Image2->Height;
     N=Image2->Width;
   

for (i=0; i<256; i++)
{
    r[i] = 0;
    g[i] = 0;
    b[i] = 0;
}

    for (j=0; j<M; j++)
      for (i=0; i<N; i++)

    {
        color = Image2->Canvas->Pixels[i][j];
        r[GetRValue(color)]++;
        g[GetGValue(color)]++;
        b[GetBValue(color)]++;
    }     /*
for (i=0; i<256; i++)
    {
        sumR += (r[i]/(M*N));
        sumG += (g[i]/(M*N));
        sumB += (b[i]/(M*N));
    }     */

for (i=0; i<256; i++)
    {
        r[i]=(r[i]/(M*N));
        g[i]=(g[i]/(M*N));
        b[i]=(b[i]/(M*N));
    }

   for (i=0; i<256; i++)
     {
     if (RGB(r[i],g[i],b[i])>0)
        O_entropia+= RGB(r[i],g[i],b[i])*( log10(RGB(r[i],g[i],b[i]))/log10(2) );
      if (RGB(r[i],g[i],b[i])==0)
        O_entropia+=0;
     }

    Edit36->Text= -O_entropia;

/edit
Chyba jednak nie da sie tego zrobić dla trzech składowych naraz. Doszedłem do wniosku, że TColor RGB przyjmuje tylko liczby całkowite a obliczone prawdopodobieństwo ma wartości miedzy 0<prawd<1
więc dlatego wynik mam ciągle 0. :/

0

Tu trzeba myśleć a nie zgadywać:
Definicja wariancji:
var(x) = &lt;(x - \bar x)^2&gt;
estymator dla wariancji:
var(x) = \frac{1}{n-1}\sum_{i=1}<sup>n(x_i - \bar x)</sup>2
Traktując kolor jako wektor o 3 składowych łatwo pokazać, że wariacja dla kolorowego obrazu jest zwykłą sumą wariacji poszczególnych kolorów.

0

to w takim razie skoro sumą wariancji poszczególnych R, G i B jest wariancja dla kolorowego obrazu. To można by zrobić tak samo dla tej entropii? Bo dla 3 naraz jak we wzorze w którym podałeś nie jestem w stanie raczej tego zrobić. I policzyłbym osobno dla r,g i b a na końcu zsumował wyniki entropii i jeśli dobrze rozumiem to miałbym entropie dla obrazu kolorowego.

0

\bar C = \left(\begin{array} \bar r \ \bar g \ \bar b \end{array}\right)
var(C)= \frac{1}{n-1}\sum_{i=1}<sup>n(C_i - \bar C)</sup>2
var(C)= \frac{1}{n-1}\sum_{i=1}<sup>n\left((r_i - \bar r)</sup>2+(g_i - \bar g)<sup>2+(b_i - \bar b)</sup>2\right)=var(r)+var(g)+var(b)
powtórz taki dowód na addytywność dla entropii do wyśle ci skrzynkę piwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1