【问题标题】:Trying to create noise image with noise, numpy, and Image尝试使用噪声、numpy 和 Image 创建噪声图像
【发布时间】:2015-12-17 01:01:21
【问题描述】:

我正在尝试在 python 中创建一些 perlin 噪声图像,但遇到了一些问题。运行我的小脚本时出现异常。我显然不了解 Image 模块的使用情况,因为我尝试的所有操作都会导致 ValueError 异常,并显示消息“缓冲区不够大”

这是我目前得到的:

import numpy
from noise import pnoise2, snoise2
import Image


octaves = 1
freq = 16.0 * octaves
y_max = 5
x_max = 5
imarray = [[0 for x in range(y_max)] for x in range(x_max)]
totalcount = 0

for y in range(y_max):
    for x in range(x_max):
        val = "%s\n" % int(snoise2(x / freq, y / freq, octaves) * 127.0 + 128.0)
        imarray[y][x] = val
        totalcount += 1

arr = numpy.asarray(imarray).astype('uint8')

im = Image.fromarray(arr, 'RGBA')
im.save('./blah.png')

我得到的例外是:

Connected to pydev debugger (build 143.1184)
Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 2407, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1798, in run
    launch(file, globals, locals)  # execute the script
  File "/Users/u4234/source/systools/load/noise_test.py", line 26, in <module>
    im = Image.fromarray(arr, 'RGBA')
  File "/Users/u4234/Library/Python/2.7/lib/python/site-packages/PIL-1.1.7-py2.7-macosx-10.10-x86_64.egg/Image.py", line 1902, in fromarray
    return frombuffer(mode, size, obj, "raw", rawmode, 0, 1)
  File "/Users/u4234/Library/Python/2.7/lib/python/site-packages/PIL-1.1.7-py2.7-macosx-10.10-x86_64.egg/Image.py", line 1853, in frombuffer
    core.map_buffer(data, size, decoder_name, None, 0, args)
ValueError: buffer is not large enough

Process finished with exit code 1

【问题讨论】:

  • 您是要创建彩色图像还是灰度图像?
  • 它应该是彩色的。虽然在这个例子中我现在只做一种颜色。

标签: python image numpy


【解决方案1】:

问题是您要求PIL 创建一个新的'RGBA' 图像,该图像需要4 个通道,但您只传递了一个二维数组,例如一个频道。

如下图所示,给定这些数组:

arr1 = numpy.zeros((5, 5), dtype=numpy.uint8)  # A single 5x5 channel
arr2 = numpy.zeros((5, 5, 3), dtype=numpy.uint8)  # 3 5x5 channels

创建灰度'L'图像:

im = Image.fromarray(arr1, 'L')  # OK
im = Image.fromarray(arr2, 'L')  # ValueError: Too many dimensions.

创建一个没有alpha通道的彩色图像'RGB'

im = Image.fromarray(arr1, 'RGB')  # ValueError: not enough image data
im = Image.fromarray(arr2, 'RGB')  # OK

注意 RGB 模式的使用,因为您可能不关心 alpha 通道,否则只需在 numpy.zeros 构造函数中添加其他维度。


你可以重写你的代码,

arr = numpy.zeros((5, 5, 1), dtype=numpy.uint8)

y_max, x_max, channels = arr.shape

for y in range(y_max):
    for x in range(x_max):
        val = int(snoise2(x / freq, y / freq, octaves) * 127.0 + 128.0)
        arr[y,x,0] = val

im = Image.fromarray(arr, 'L')
im.save('./blah.png')

生成灰度图像。

【讨论】:

  • 就是这样 :) 谢谢 memoselyk。如果我可以投票给你,我会的。但是我还没有足够的声望。一个衷心的“谢谢”行吗?
  • 当然,不客气!顺便说一句...有一个 numpy.function 可以简化您的噪声生成器,如果它是图像坐标的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-01-27
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多