Portfolio[UWM] Techniki Multimedialne / PIRO

Szum o rozkładzie normalnym

ma parametry:
  • _Mean wartość średnia zakłócenia,
  • _Sigma odchylenie standardowe,
  • _Density określające prawdopodobieństwo wystąpienia szumu w danym pikselu.


BitMap addNoiseNor(BitMap _BitMap, int _Mean, float _Sigma, float _Density)
{
    // tworzenie nowej bitmapy
    BitMap oNew = _BitMap;
    oNew.Pixels = Clone(_BitMap);

    // proces zaszumiania
    for(int y = 0; y < oNew.Height; y++)
        for(int x = 0; x < oNew.Width; x++)
        {
            // pobranie składowych piksela [x,y]
            Pix oPix = Get_PIX(x, y, oNew);

            // jeżeli, zdarzenie na danym pikselu wystąpiło, wtedy zaszumiamy
            if(1.0*_Density > rand()/(1.0*RAND_MAX))
            {
                // losowanie U0 i U1
                float U0 = rand()/(1.0*RAND_MAX);
                float U1 = rand()/(1.0*RAND_MAX);

                // implementacja wzoru Z1
                float Z1 = sqrt(-2 * log(U0)) * sin(2 * 3.14 * U1) * _Sigma + _Mean;

                // ustawiamy nowe wartości składowych
                oPix.Light = max(min(255, oPix.Light - Z1),0);
                oPix.Red = max(min(255, oPix.Red - Z1),0);
                oPix.Green = max(min(255, oPix.Green - Z1),0);
                oPix.Blue = max(min(255, oPix.Blue - Z1),0);
            }

            // zapisanie do nowej bitmapy, nowych składowych
            Set_PIX(x, y, oPix, oNew);
        }
    return oNew;
}

// przykładowe użycie, przedstawionych obrazków powyżej
addNoiseNor(oBMP_Src, 50, 0.5, 0.5);


Opis działania


dzięki bazowej transformacji Box-Mullera, przykładowo ze wzoru :

lub

gdzie U1 i U2 są liczbami z przedziału (0,1].
Wynikiem jednego z powyższych wzorów jest dostanie liczbę Z o rozkładnie normalnym z odchyleniem standardowym równym 1, aby uzyskać liczbę o rozkładnie normalnym o podanym odchyleniu standardowym (Sigma) i o wartości średniej zakłócenia (Mean) musimy naszą Z pomnożyć przez Sigma i dodać Mean tzn.
Z = Z * Sigma + Mean.


Uwaga!!

// działanie, takie :
int oA = ?;
oA = max(min(255, oA),0);

// jest równoważne z :
int oA = ?; if( oA > 255 ) oA = 255; else if( oA < 0 ) oA = 0;

  • Administracja