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

如何将280x280像素图片转为28x28并生成784x1像素值数组?

可行解决方案:将280x280 PNG转为28x28并生成784x1像素数组

核心思路

先解码data:image/png格式的图片数据,再缩放到28x28像素,最后提取像素值生成一维数组。以下是基于Python工具库的稳定实现方案:

方案一:使用Pillow库(推荐)

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

def process_image(data_uri):
    # 解码data URI中的base64图片数据
    header, encoded = data_uri.split(',', 1)
    image_data = base64.b64decode(encoded)
    
    # 读取图片并转为灰度图
    with Image.open(BytesIO(image_data)) as img:
        gray_img = img.convert('L')  # 转为0-255的单通道灰度值
        # 缩放到28x28,用LANCZOS插值保证缩小后的细节
        resized_img = gray_img.resize((28, 28), Image.Resampling.LANCZOS)
    
    # 生成784x1的像素数组
    pixel_array = np.array(resized_img).flatten().reshape(784, 1)
    
    return pixel_array

# 示例调用(替换为你的data URI)
test_data_uri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
result = process_image(test_data_uri)
print(result.shape)  # 输出 (784, 1)

关键细节说明

  • data URI解码:拆分URI头部与编码内容,用base64解码得到二进制流,这是很多工具包失败的核心遗漏步骤。
  • 灰度转换:convert('L')确保彩色图片转为单通道灰度值,避免多通道像素值干扰数组生成。
  • 插值选择:LANCZOS插值比默认算法更适合缩小图片,能最大程度保留原图像细节,减少像素值失真。

方案二:使用OpenCV替代(若Pillow有兼容问题)

import base64
import cv2
import numpy as np

def process_image_opencv(data_uri):
    header, encoded = data_uri.split(',', 1)
    image_data = base64.b64decode(encoded)
    # 转成OpenCV可读的数组格式
    np_arr = np.frombuffer(image_data, np.uint8)
    img = cv2.imdecode(np_arr, cv2.IMREAD_GRAYSCALE)
    # 缩放到28x28
    resized_img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_LANCZOS4)
    # 生成目标数组
    pixel_array = resized_img.flatten().reshape(784, 1)
    return pixel_array

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:55:25