Portfolio[UWM] Techniki Multimedialne / PIRO

Szum typu "pieprz i sól"

ma parametry:
  • _BitMap źródło obrazka,
  • _Density określające prawdopodobieństwo wystąpienia szumu w danym pikselu,
BitMap addNoiseSP(BitMap _BitMap, float _Density)
{
// jest tutaj tworzona tablica, która odpowiedzialna jest za to.
// czy dany piksel będzie mieć wartość 0 czy 255
// oczywiście można to rozwiązać inaczej int oR[4]; oR[0] = 255; for(int i = 1; i < 4; i++) oR[i] = -1*oR[i-1];
// tworzenie nowej bitmapy BitMap oNew = _BitMap; oNew.Pixels = Clone(_BitMap);

// proces zaszumienia 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 zaszumimy if(_Density > rand()/(1.0*RAND_MAX)) {
// losowanie liczby całkowitej z przedziału [0,3]
int oRand = (int)(rand()/(1.0*RAND_MAX)*3+1);
// oczywiście można to zastąpić
// gdzie liczba będzie 0 lub 1,
// potem zamiast oR[oRand] dać oRand*255
oPix.Light = max(min(255, oR[oRand]),0);

// jeżeli jest to obrazek 25bit...
// dodaje element losowości dla danego kanału tzn.
// ze zaszumiamy jeden z kanałów if(_Density > rand()/(1.0*RAND_MAX)) oPix.Red = max(min(255, oR[oRand]),0); else if(_Density > rand()/(1.0*RAND_MAX)) oPix.Green = max(min(255, oR[oRand]),0); else oPix.Blue = max(min(255, oR[oRand]),0); } Set_PIX(x, y, oPix, oNew); } return oNew; }

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

Zaszumienie typu "pierz i sól" objawia się na obrazach w postaci pojedynczych punktów o wartości minimalnej lub maksymalnej jaką może mieć dany piksel ( czyli, w naszym przypadku 0 lub 255 ) tzn. wartości odbiegających mocno od obecnej wartości na składowej danej piksela.
Ogólnie dla 8-bitmapy będą to czarne lub białe piksele, kiedy jest to 24-bitmapa wtedy jakaś składowa będzie mieć wartość maksymalną lub minimalną, wtedy zauważamy rorzucone po obrazie specyficzne piksele o kolorach składowych.

  • Administracja