numpy与cv2实现的图像process函数逐行原理解析
Atari游戏图像预处理process函数逐行解析
原有推导内容校正
你之前推导的3条逻辑,2条正确,1条描述不完整:
if frame.size == 240 * 256 * 3:逻辑正确:校验输入numpy数组的总元素个数,判断是否为高240、宽256的3通道RGB格式Atari游戏帧,不匹配就直接触发断言,抛出"Unknown resolution"错误。img = np.reshape(frame, [240, 256, 3]).astype(np.float32)描述不完整:这行首先把gym返回的扁平化存储的帧数据,重构为[高度, 宽度, 通道数]结构的标准三维图像数组,之后才是将数组数值类型转换为np.float32,避免后续加权计算时出现整数截断、精度不足的问题。img = img[:, :, 0] * 0.299 + img[:, :, 1] * 0.587 + img[:, :, 2] * 0.114逻辑正确:使用人眼亮度感知加权公式(R通道权重0.299、G通道权重0.587、B通道权重0.114)将三通道RGB图转为单通道灰度图,权重和OpenCVcvtColor转灰度的默认参数完全一致。
剩余代码逐行逻辑说明
resized_screen = cv2.resize(img, (84, 110), interpolation=cv2.INTER_AREA):将转换后的灰度图下采样到宽84、高110的尺寸。这里选用INTER_AREA插值是因为该方法基于像素区域重采样,下采样时不容易产生伪影,适合图像压缩场景。注意OpenCV的resize参数顺序为(目标宽度, 目标高度),和numpy数组(高度, 宽度)的维度顺序相反,不要混淆。x_t = resized_screen[18:102, :]:对缩放后的110高度图像做垂直方向裁剪,截去顶部18像素、底部8像素的区域——这部分通常是游戏的分数栏、状态栏等和智能体决策无关的冗余信息,裁剪后剩余高度为102-18=84,和宽度一致,刚好得到84×84的有效游戏画面。x_t = np.reshape(x_t, [84, 84, 1]):给二维的灰度图增加一个长度为1的通道维度,将数组形状从[84, 84]调整为卷积神经网络通用的[高度, 宽度, 通道数]输入格式,适配后续模型的输入要求。return x_t.astype(np.uint8):将计算过程中使用的float32类型像素值转换回0-255取值范围的np.uint8类型,降低数据存储占用,提升后续训练阶段的数据读取、计算效率。
补充说明:这套预处理流程是DQN系列深度强化学习模型处理Atari游戏的经典标准流程,最终输出的84×84灰度图把原始输入的数据量压缩了近26倍,在保留核心决策信息的前提下大幅降低了模型训练的计算开销。
内容的提问来源于stack exchange,提问作者Programer Beginner
相关产品推荐
相关产品推荐

