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

如何在Python(PIL)中对布尔掩码区域内的图像像素随机置换?

解决掩码区域像素随机置换时颜色混乱的问题

问题核心是:当你用array[mask]提取人脸区域像素时,得到的是形状为(N, 3)的数组(N是人脸像素数量,3是RGB通道)。原来的_shuffle_2D函数会同时打乱数组的行和列,导致单个像素的RGB通道值被拆分打乱,最终颜色混乱。

正确的做法是只打乱像素的位置(即数组的行),保持每个像素的RGB通道绑定,具体实现如下:

修改后的完整代码

from PIL import Image
import requests
from io import BytesIO
import numpy as np 

# 加载图片
response = requests.get("https://www.4dface.io/wp-content/uploads/2018/10/4DFM_sample2.jpg")
img = Image.open(BytesIO(response.content))
array = np.array(img)

# 生成掩码(非白色背景区域)
mask = np.array(img.convert("L")) != 255

# 提取人脸区域的像素,形状为(N, 3)
face_pixels = array[mask]

# 对人脸像素的行进行随机洗牌(每个像素的RGB通道保持完整)
np.random.shuffle(face_pixels)

# 将洗牌后的像素赋值回原数组的掩码区域
array[mask] = face_pixels

# 显示结果
Image.fromarray(array).show()

关键说明

  • np.random.shuffle(face_pixels)会直接对face_pixels的行进行原地洗牌,每个行对应一个完整的RGB像素,因此不会破坏颜色通道的关联性。
  • 原_shuffle_2D函数是针对二维图像(形状H×W×3)的整体行列打乱,不适用于一维化的人脸像素数组(N×3),这是导致颜色混乱的根本原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:45:42