2016-01-19 3 views
8

教授が講義でそれを述べた後、ちょうどred noiseの記事を読んだだけです。赤いノイズはどのように実装するのですか?

私の考えは、{0、...、255}の乱数で始めることでした。次に、{0、...、255}にランダムオフセットを追加して、最初の行を左から右へ終えます。 最初の行が終了すると、上と下の要素の平均値をとり、次のピクセルのランダムオフセットを追加します。

このようにして、画像を左から右、上から下に作成します。私はこのようにそれを実装しました

#!/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) 

enter image description here

を与えるそれはクールに見えます。しかし、私はそれがこのように見えるはずだと思います:https://commons.wikimedia.org/wiki/File:Red.noise.col.png

私は何をやっていますか/どうすれば修正できますか?

+0

ウィキペディアの画像では、重いフィルタリングがはっきりとわかります。滑らかで、ざらざらしたエッジはありません。有色ノイズは、通常、少なくともオーディオ領域では、高周波成分を減衰させることによって実現されます。私はあなたのコードを "修正する"方法を見ていない、あなたは正しいアプローチを見てください(私はそこにたくさんのGoogleヒットがあると確信しています)。 –

+0

私が知る限り、ノイズの* color *は、与えられたノイズの(パワー)スペクトルについて何かを言います。あなたのストライプ画像には依然として赤いノイズスペクトルがあります。空間的な変化は、赤色のノイズとは関係ありません。 –

+0

@AndrasDeak:しかし、それは本当の*ノイズ*(すなわち、ランダム)ではありません。 –

答えて

2

左と上の有効な位置にあるときに相関値を計算するときに問題が発生する可能性があります。私はこれがあるべきだと思う

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

を:あなたは持っているあなたが実際に上記のピクセルをしたいときは、左上記とに上記とdiagonllyピクセルの平均値を取っているあなたのバージョンで

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

と左のピクセル。

+0

このバグとは別に、あなたのアルゴリズムとwikiから提供される画像との唯一の違いはおそらく色相だと思います。お役に立てれば! – cr1msonB1ade

+2

これは、ラインが45度対角線ではない理由を説明しますが、一般的なパターンが提供されたスクリーンショットと一致しない理由を説明していません –

+1

私の解決策は明らかに@o_oによって指摘されるように茶色のノイズを生成しません。 2次元相関ノイズは1Dノイズよりも少し複雑で、これはwikiによって光沢がついています。ピンクノイズ生成に関するもう1つのSO交換があります:http://stackoverflow.com/questions/19367474/create-pink-noise-image-in-matlab MATLAB実装へのリンクをたどってピンクやブラウン/赤い騒音。この解は、ランダム位相シフトを伴う逆フーリエ変換を含む。 – cr1msonB1ade

関連する問題