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

