【问题标题】:How do I implement red noise?如何实现红噪声?
【发布时间】:2016-01-19 22:24:59
【问题描述】:

在一位教授在讲座中提到它后,我刚刚阅读了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)

给了

看起来很酷。不过,我觉得应该更像这样:https://commons.wikimedia.org/wiki/File:Red.noise.col.png

我做错了什么/我该如何解决?

【问题讨论】:

  • 在维基百科的图片上你可以清楚地看到重过滤,它很平滑,没有粗糙的边缘。有色噪声通常是通过衰减高频分量来实现的。至少在音频域中。我没有看到“修复”您的代码的方法,您应该查找正确的方法(我确信有很多谷歌点击)。
  • 据我所知,噪声的 color 说明了给定噪声的(功率)频谱。您的条纹图像仍可能具有红噪声频谱。空间变化与红色噪声无关,是吗?
  • @AndrasDeak: 但它不会是真正的噪音(即随机)。
  • @KarolyHorvath 好吧,至少不是来自布朗运动的:)

标签: python computer-vision


【解决方案1】:

我认为问题可能在于当您在左侧和上方有一个有效位置时计算相关值。你有:

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

我认为应该是:

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

在您的版本中,当您实际想要上方的像素和左侧的像素时,您会取上方和对角上方和左侧像素的平均值。

【讨论】:

  • 除此错误外,我认为您的算法与 wiki 提供的图像之间的唯一区别可能是色调。希望这会有所帮助!
  • 这解释了为什么线条不是 45 度对角线,但它没有解释为什么一般模式与提供的屏幕截图不匹配
  • 好的,所以我的解决方案显然不会像@o_o 所指出的那样产生棕色噪音。 2D 相关噪声比 1D 噪声稍微复杂一些,维基对此进行了掩饰。这是关于粉红噪声生成的另一个 SO 交流:stackoverflow.com/questions/19367474/… 您可以按照提供的链接到 MATLAB 实现以产生粉红或棕色/红色噪声。该解决方案涉及具有随机相移的傅里叶逆变换。
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 2010-10-11
  • 2012-01-31
  • 2022-01-23
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2015-03-31
相关资源
最近更新 更多