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

Python PIL/NumPy图像像素混合报错:ValueError赋值目标只读

解决ValueError: assignment destination is read-only问题及图片混合逻辑优化

错误原因

用np.asarray()将PIL Image转为NumPy数组时,得到的数组是只读的(直接映射了图片的内存缓冲区)。你把final_product = array1只是让它指向同一个只读数组,所以赋值操作会触发ValueError。

解决方法

有两种简单方式让数组可写:

  • 方式1:创建数组副本
    将final_product = array1改为:
    final_product = array1.copy()
    
  • 方式2:用np.array()替代np.asarray()
    np.array()默认会创建可修改的副本,修改数组转换代码:
    array1 = np.array(image1)
    array2 = np.array(image2)
    

图片混合逻辑优化

你当前的循环逻辑有问题:len(array1[0])是图片的宽度(列数),但final_product[i]是修改第i行,这和你“逐像素混合”的需求不符。如果要实现隔列混合(比如偶数列用第二张图的像素),推荐用NumPy切片操作(比Python循环高效得多):

# 所有行的偶数索引列(0、2、4...)替换为array2的对应像素
final_product[:, ::2] = array2[:, ::2]

修改后的完整代码

import numpy as np
from PIL import Image

def main():
    # 读取两张图片
    image1 = Image.open("/Users/whickey27/Pictures/Photo Booth Library/Pictures/Photo on 10-16-23 at 11.38 AM.jpg")
    image2 = Image.open("/Users/whickey27/Pictures/Photo Booth Library/Pictures/Photo on 10-16-23 at 11.39 AM.jpg")

    # 转换为可修改的NumPy数组
    array1 = np.array(image1)
    array2 = np.array(image2)

    # 创建可写副本
    final_product = array1.copy()

    # 高效实现隔列混合
    final_product[:, ::2] = array2[:, ::2]

    # 保存结果图片
    Image.fromarray(final_product).save("my_mixed_image.png")

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:35:20