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
相关产品推荐
相关产品推荐

