蓝桥杯人工智能赛道-实战赛模拟题之图像数据预处理

图像数据预处理

介绍

在新媒体平台上,用户经常分享各种图片,这些图片反映了他们的兴趣和喜好。因此这些图片就可以用来制作后续图像分析要用的图像数据集。在本任务中,我们收集并整理出了一批图像数据,现在需要你们研发小组对该数据集进行必要的图像预处理。

准备

开始答题前,请确认 /home/project 目录下包含以下文件:

  • Imagedata.zip

  • task.py

    其中:

  • Imagedata.zip,是本任务提供的数据集。解压后,你将看到一个 image_class_index.json 文件和一个 images 文件夹。

    • image_class_index.json 文件,类别索引映射文件。
    • images 文件夹,包含了若干文件夹,每个文件夹下是同一类别的图像。
  • task.py,是你后续答题过程中编写代码的地方。

提示:可输入命令 unzip -q -o /home/project/Imagedata.zip -d ./ 解压文件夹。

目标

请在 task.py 文件中编写代码,并按以下要求完善 img_processor 函数,实现对数据集的预处理。

  • 函数功能
    • 对输入图像进行预处理,包括图像缩放、中心裁剪和标准化。
  • 参数
    • data_path:字符串,指定图像文件的路径。
    • dst_size:元组,指定最终输出图像的目标尺寸,默认为 (224, 224)。
  • 返回值
    • image_src:numpy.ndarray,原始图像。
    • image:numpy.ndarray,预处理后的图像,尺寸为 dst_size。
    • (startx, starty):元组,表示实现中心裁剪时,对原始图像数组进行切片的起始索引位置。

基于以下代码块在 img_processor 函数中 #TODO 处补充代码,确保实现以下目标。
① 图像缩放:将图像大小调整为 (256, 256)。
② 中心裁剪:计算正确的起始索引,裁剪出大小为 (224, 224) 的中心区域。
③ 标准化:使用代码中设置的 _mean 和 _std 对图像像素进行标准化。

提示:点击代码块右上方的 copy 按钮,将代码完整复制到右侧环境中后开始编码。

#task-start
import numpy as np 
import pandas as pd 
import json
import cv2
import os

def img_processor(data_path, dst_size = (224,224)):
    Image_std = [0.229, 0.224, 0.225]
    Image_mean = [0.485, 0.456, 0.406]
    _std = np.array(Image_std).reshape((1,1,3))
    _mean = np.array(Image_mean).reshape((1,1,3))
    image_src = cv2.imread(data_path)
    #TODO
    

    return image_src, image, (startx,starty)


def simple_generator(data_list, json_file, dst_size = (224, 224)):
    with open(json_file, 'r') as f:
        data = json.load(f)
    folder_map = {v[0]: (int(k), v[1]) for k,v in data.items()}

    for img_path in data_list:
        image_src, image, (startx,starty) = img_processor(img_path, dst_size)
        label = folder_map[img_path.split('/')[-2]]
        yield image_src, image, label, (startx,starty)

def main():
    Image_path = 'Imagedata/images'
    Json_path = 'Imagedata/image_class_index.json'

    data_list = []
    for dirname, _, filenames in os.walk(Image_path):
        if os.path.basename(dirname).startswith('n'):
            for filename in filenames:
                data_list.append(os.path.join(dirname, filename))

    # 创建生成器
    generator = simple_generator(data_list, Json_path)

    # 查看示例,检查图像、标签等属性的正确性
    num_samples = 5
    for _ in range(num_samples):
        image_src, image, label, (startx,starty) = next(generator)
        print("SrcImage shape:", image_src.shape)
        print("Image shape:", image.shape)
        print("Label:", label)
        print("startx and starty:",(startx,starty))

if __name__ == '__main__':
    main()
#task-end

规定
  • 务必在 #TODO 所在的函数范围内编写代码,以免造成判题不通过。
  • 切勿删除以上代码块中的任何字符,以免造成判题不通过。
  • 切勿修改任务中默认提供的文件名称、函数名称等,以免造成判题不通过。
判分标准
  • 实现目标,该题得 7 分。
  • 未实现目标,该题得 0 分。

实现代码:

#TODO
    #1.图像缩放:将图像大小调整为 (256, 256)。
    image = cv2.resize(image_src,(256,256))#cv2的给一个图像重新赋值并改变大小

    #2.中心裁剪:计算裁剪的起始坐标 startx 和 starty,从图像中裁剪出大小为 (224, 224) 的中心区域。
    startx = 256//2 - (224//2)
    starty = 256//2 - (224//2)
    image = image[starty:starty+224,startx:startx+224]

    #3.标准化:使用代码中设置的 _mean 和 _std 对图像像素进行标准化。
    image=(image-_mean)/_std

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值