2016-01-19 15 views
8

Ho appena letto l'articolo red noise dopo che un professore l'ha menzionato in una conferenza.Come si implementa il rumore rosso?

La mia idea era di iniziare con un numero casuale in {0, ..., 255}. Poi finisco la prima riga da sinistra a destra aggiungendo un offset casuale in {0, ..., 255}. Appena terminata la prima riga, prenderò la media dell'elemento superiore e sinistro e aggiungerò un offset casuale per il pixel successivo.

In questo modo, creo l'immagine da sinistra a destra, dall'alto verso il basso.

Ho implementato in questo modo:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

"""Create a red noise RGB image of the dimensions you want.""" 

import numpy 
import Image 
import random 


def create_red_noise(outfile, width, height, r=10): 
    """ 
    Create red noise RGB image 

    Parameters 
    ---------- 
    outfile : str 
    width : int 
    height : int 
    r : int 
     Random maximum offset compared to the last pixel 
    """ 
    array = numpy.random.rand(height, width, 3) * 255 
    for x in range(width): 
     for y in range(height): 
      if y == 0: 
       if x == 0: 
        continue 
       else: 
        for i in range(3): 
         array[y][x][i] = (array[y][x-1][i] + 
              random.randint(-r, r)) 
      else: 
       if x == 0: 
        for i in range(3): 
         array[y][x][i] = (array[y-1][x][i] + 
              random.randint(-r, r)) 
       else: 
        for i in range(3): 
         array[y][x][i] = (((array[y-1][x][i] + 
              array[y-1][x-1][i])/2.0 + 
              random.randint(-r, r))) 
    im_out = Image.fromarray(array.astype('uint8')).convert('RGBA') 
    im_out.save(outfile) 


def get_parser(): 
    """Get parser object for create_random_image.py.""" 
    from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter 
    parser = ArgumentParser(description=__doc__, 
          formatter_class=ArgumentDefaultsHelpFormatter) 
    parser.add_argument("-f", "--file", 
         dest="filename", 
         help="write red noise image to FILE", 
         default="red-noise.jpg", 
         metavar="FILE") 
    parser.add_argument("-x", "--width", 
         dest="width", 
         default=1280, 
         type=int, 
         help="width of the image") 
    parser.add_argument("-y", "--height", 
         dest="height", 
         default=960, 
         type=int, 
         help="height of the image") 
    parser.add_argument("-o", "--offset", 
         dest="offset", 
         default=10, 
         type=int, 
         help="maximum offset compared to the neighbors") 
    return parser 


if __name__ == "__main__": 
    args = get_parser().parse_args() 
    create_red_noise(args.filename, args.width, args.height, args.offset) 

che dà

enter image description here

Sembra fresco. Tuttavia, penso che dovrebbe essere più simile a questo: https://commons.wikimedia.org/wiki/File:Red.noise.col.png

Cosa sto facendo di sbagliato/come posso risolvere il problema?

+0

Nell'immagine di wikipedia è possibile vedere chiaramente i filtri pesanti, è scorrevole, non ci sono spigoli. Normalmente i disturbi colorati vengono implementati attenuando i componenti ad alta frequenza .. almeno nel dominio audio. Non vedo un modo per "sistemare" il tuo codice, dovresti cercare l'approccio giusto (sono sicuro che ci sono un sacco di hit di Google). –

+0

Per quanto ne so, il * colore * del rumore dice qualcosa sullo spettro (di potenza) del rumore dato. L'immagine a strisce può ancora avere uno spettro di rumore rosso. La variazione spaziale non è correlata al fatto che il rumore sia rosso, vero? –

+0

@AndrasDeak: ma non sarà un * rumore * reale (cioè casuale). –

risposta

2

Penso che il problema potrebbe essere quando si sta calcolando il valore correlato quando si dispone di una posizione valida a sinistra e sopra. Hai:

array[y][x][i] = (((array[y-1][x][i] + 
        array[y-1][x-1][i])/2.0 + 
        random.randint(-r, r))) 

credo che questo dovrebbe essere:

array[y][x][i] = (((array[y-1][x][i] + 
        array[y][x-1][i])/2.0 + 
        random.randint(-r, r))) 

Nella vostra versione si sta prendendo la media del pixel sopra e diagonlly sopra ea sinistra quando si vuole realmente il pixel sopra e il pixel a sinistra.

+0

Oltre a questo errore, penso che l'unica differenza tra il tuo algoritmo e l'immagine fornita dal wiki sia probabilmente la tonalità. Spero che questo ti aiuti! – cr1msonB1ade

+2

Questo spiega perché le linee non hanno una diagonale di 45 gradi, ma non spiega perché lo schema generale non corrisponde allo screenshot fornito –

+1

Ok, quindi la mia soluzione ovviamente non crea rumore marrone come sottolineato da @o_o. Il rumore correlato 2D è un po 'più complicato del rumore 1D e questo è sorvolato dalla wiki. Ecco un altro scambio SO riguardante la generazione del rumore rosa: http://stackoverflow.com/questions/19367474/create-pink-noise-image-in-matlab puoi seguire il link fornito a un'implementazione di MATLAB per produrre sia rosa che marrone/rumore rosso. La soluzione implica una trasformata di Fourier inversa con spostamenti di fase casuali. – cr1msonB1ade

Problemi correlati