尝试使用noise、numpy和Imag创建噪波图像

2024-05-19 15:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python创建一些perlin噪声图像,但有一点问题。我在运行我的小脚本时遇到了一个异常。很明显,我没有掌握映像模块的用法,因为我尝试的所有操作都会导致ValueError异常,并显示消息“buffer is not large tooth”

到目前为止,我得到的是:

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')

我得到的例外是:

^{pr2}$

Tags: inimageimportnumpyforrangevalmax
1条回答
网友
1楼 · 发布于 2024-05-19 15:40:22

问题是您要求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'图像:

^{pr2}$

创建没有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')

生成灰度图像。在

相关问题 更多 >