如何在Python中对图像降采样并提取黑白像素值?
解决手写数字识别的图像导入与批量数据问题
一、实现8*8图像转二进制像素矩阵
用Python的Pillow库就能轻松处理图像,先安装依赖:
pip install pillow
然后完善你的pfi函数,实现图像读取、灰度转换、尺寸调整和二值化逻辑:
from PIL import Image def pfi(image_path): # 打开图像并转为灰度模式(0-255灰度值) img = Image.open(image_path).convert('L') # 强制调整为8*8尺寸 img_8x8 = img.resize((8, 8)) # 获取所有像素值的列表 pixel_values = list(img_8x8.getdata()) # 二值化:以127为阈值,大于设为1,小于等于设为0,生成8*8矩阵 binary_matrix = [[1 if pixel > 127 else 0 for pixel in pixel_values[i*8:(i+1)*8]] for i in range(8)] # 如果需要直接适配输入层的一维数组,替换成下面一行 # binary_flat = [1 if pixel > 127 else 0 for pixel in pixel_values] return binary_matrix
调用示例:
# 获取8*8二进制像素矩阵 digit_matrix = pfi("test_digit.png") # 转为一维数组赋值给输入节点 startnodes = [pixel for row in digit_matrix for pixel in row]
二、获取批量手写数字图像
最适配的是MNIST手写数字数据集,包含70000张标准手写数字图像,可直接缩放到8*8使用:
用sklearn快速加载预处理
先安装依赖:
pip install scikit-learn numpy
加载并处理数据:
from sklearn.datasets import fetch_openml import numpy as np # 加载MNIST数据集 mnist = fetch_openml('mnist_784', version=1, cache=True) raw_images = mnist.data # 70000条28*28的图像数据(展平为784维数组) labels = mnist.target # 对应数字标签0-9 # 把28*28图像缩放到8*8并二值化 def process_image(raw_img): # 还原为28*28的灰度图 img = Image.fromarray(raw_img.reshape(28,28).astype(np.uint8)) # 缩放为8*8并转灰度 img_8x8 = img.resize((8,8)).convert('L') # 二值化后展平为64维数组 return np.where(np.array(img_8x8) > 127, 1, 0).flatten() # 批量处理所有图像 train_data = np.array([process_image(img) for img in raw_images])
这样你就得到了70000条适配输入层的二进制图像数据,直接用于神经网络训练。
本地批量读取自定义图像
如果有自己的手写数字图像文件夹,用下面的代码批量读取:
import os def load_batch_data(folder_path): batch_data = [] # 遍历文件夹下所有图像文件 for filename in os.listdir(folder_path): if filename.endswith(('.png', '.jpg', '.jpeg')): img_path = os.path.join(folder_path, filename) # 调用pfi获取一维二进制数组 binary_flat = [pixel for row in pfi(img_path) for pixel in row] batch_data.append(binary_flat) return batch_data # 调用示例 custom_batch = load_batch_data("your_digit_images_folder")
内容的提问来源于stack exchange,提问作者Jameson
相关产品推荐
相关产品推荐

