You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python生成扩散过程图像?解决现有代码的像素团块问题

解决扩散模拟中黑色像素团块问题的实现方法

问题根源

你的代码出现团块的核心原因:

  • 顺序遍历修改像素,前面的移动会干扰后续像素的处理,导致黑色像素容易被"推"到一起
  • 只有黑色像素单向移动到透明位置,没有反向随机交换,无法模拟真正的扩散平衡

正确实现思路

要生成均匀扩散的效果,需采用随机像素对交换的方式,让黑色像素和透明像素在圆形区域内随机交换位置,模拟无规则热运动的扩散过程,最终会趋近于均匀分布(高熵状态)。

修正后的代码

import random
from PIL import Image

def create_diffusion_states(circle_radius=200):
    # 创建画布,圆形居中
    size = (circle_radius*2, circle_radius*2)
    im = Image.new('RGBA', size, (0,0,0,0))
    pixels = im.load()
    
    # 预先生成圆形内的所有有效像素坐标(替代badpixels的低效判断)
    center_x, center_y = circle_radius, circle_radius
    valid_pixels = []
    for x in range(size[0]):
        for y in range(size[1]):
            if (x - center_x)**2 + (y - center_y)**2 <= circle_radius**2:
                valid_pixels.append((x, y))
    
    # 1. 初始化低熵状态:上半圆为黑色,下半圆透明
    black_pixels = []
    transparent_pixels = []
    for (x, y) in valid_pixels:
        if y <= center_y:
            pixels[x, y] = (0,0,0,255)
            black_pixels.append((x, y))
        else:
            transparent_pixels.append((x, y))
    
    # 保存低熵状态
    im.save('low_entropy.png')
    
    # 2. 迭代生成中熵状态(例如2000次交换)
    for _ in range(2000):
        if not black_pixels or not transparent_pixels:
            break
        # 随机选一个黑色像素和一个透明像素交换
        black_idx = random.randint(0, len(black_pixels)-1)
        trans_idx = random.randint(0, len(transparent_pixels)-1)
        
        bx, by = black_pixels[black_idx]
        tx, ty = transparent_pixels[trans_idx]
        
        # 交换像素状态
        pixels[bx, by] = (0,0,0,0)
        pixels[tx, ty] = (0,0,0,255)
        
        # 更新两个列表
        black_pixels[black_idx], transparent_pixels[trans_idx] = transparent_pixels[trans_idx], black_pixels[black_idx]
    
    im.save('medium_entropy.png')
    
    # 3. 继续迭代生成高熵状态(再增加8000次交换,总共10000次)
    for _ in range(8000):
        if not black_pixels or not transparent_pixels:
            break
        black_idx = random.randint(0, len(black_pixels)-1)
        trans_idx = random.randint(0, len(transparent_pixels)-1)
        
        bx, by = black_pixels[black_idx]
        tx, ty = transparent_pixels[trans_idx]
        
        pixels[bx, by] = (0,0,0,0)
        pixels[tx, ty] = (0,0,0,255)
        
        black_pixels[black_idx], transparent_pixels[trans_idx] = transparent_pixels[trans_idx], black_pixels[black_idx]
    
    im.save('high_entropy.png')

create_diffusion_states()

关键细节说明

  • 预生成有效像素列表:提前计算圆形内的所有坐标,避免每次迭代都做距离判断,提升效率
  • 双向随机交换:每次随机选取黑色和透明像素交换,保证扩散过程的对称性,不会出现单向聚集
  • 状态列表维护:用两个列表分别记录黑色和透明像素的坐标,避免每次遍历整个画布查找,大幅提升性能
  • 迭代次数控制:通过调整迭代次数,精准控制熵的程度——初始状态为低熵,少量迭代后是中熵,大量迭代后趋近于完全随机的高熵

内容的提问来源于stack exchange,提问作者user1302130

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:15:07