[英]Trying to create noise image with noise, numpy, and Image
我正在尝试在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
问题是您要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')
生成灰度图像。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.