gpt4 book ai didi

python - 柏林噪声伪影

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:38 25 4
gpt4 key购买 nike

我拿了Wikipedia Perlin Noise Algorithm并用 Python 实现它,这里是代码:

import random
import math
from PIL import Image
from decimal import Decimal


IMAGE_SIZE = 200
PERLIN_RESOLUTION = 10
GRADIENT = []


for x in range(PERLIN_RESOLUTION + 1):
GRADIENT.append([])
for y in range(PERLIN_RESOLUTION + 1):
angle = random.random() * 2 * math.pi
vector = (
Decimal(math.cos(angle)),
Decimal(math.sin(angle))
)
GRADIENT[x].append(vector)


def lerp(a0, a1, w):
return (1 - w)*a0 + w*a1


def dotGridGradient(ix, iy, x, y):

dx = x - Decimal(ix)
dy = y - Decimal(iy)

return (dx*GRADIENT[iy][ix][0] + dy*GRADIENT[iy][ix][1])


def perlin(x, y):
if x > 0.0:
x0 = int(x)
else:
x0 = int(x) - 1
x1 = x0 + 1
if y > 0.0:
y0 = int(y)
else:
y0 = int(y) - 1
y1 = y0 + 1

sx = x - Decimal(x0)
sy = y - Decimal(y0)

n0 = dotGridGradient(x0, y0, x, y)
n1 = dotGridGradient(x1, y0, x, y)
ix0 = lerp(n0, n1, sx)
n0 = dotGridGradient(x0, y1, x, y)
n1 = dotGridGradient(x1, y1, x, y)
ix1 = lerp(n0, n1, sx)
value = lerp(ix0, ix1, sy)

return value


image = Image.new('RGB', (IMAGE_SIZE, IMAGE_SIZE))
pixels = image.load()
for i in range(IMAGE_SIZE):
x = Decimal(i) / IMAGE_SIZE
for j in range(IMAGE_SIZE):
y = Decimal(j) / IMAGE_SIZE
value = perlin(x * 10, y * 10)
greyscale = (value + 1) * 255 / 2
pixels[i, j] = (greyscale, greyscale, greyscale)
image.save('artifacts.png', 'PNG')

这是脚本创建的结果图像:

Perlin with artifacts

我一定在这里遗漏了一些东西,你可以非常清楚地看到顶点。谁能告诉我出了什么问题?

最佳答案

您需要使用 smoothstep而不是线性插值。

def smoothstep(a0, a1, w):
value = w*w*w*(w*(w*6 - 15) + 10)
return a0 + value*(a1 - a0)

关于python - 柏林噪声伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42478137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com