导入需要的库

import torch import torchvision.datasets as dsets import torchvision.transforms as transforms import torch.utils.data as Data import matplotlib.pyplot as plt import numpy as np import cv2

读取Fashion-MNIST数据集

train_data = dsets.FashionMNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_data = dsets.FashionMNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True)

构建Dataset

train_dataset = Data.Dataset.from_tensor_slices((train_data.data, train_data.targets)) test_dataset = Data.Dataset.from_tensor_slices((test_data.data, test_data.targets))

构建Dataloader

train_loader = Data.DataLoader(dataset=train_dataset, batch_size=10, shuffle=True) test_loader = Data.DataLoader(dataset=test_dataset, batch_size=10, shuffle=False)

遍历测试用Dataloader,绘制前10个样本

def show_images(dataloader): for images, labels in dataloader: # 将Tensor转成numpy数组 images = images.numpy() labels = labels.numpy() # 取出前10个样本 images = images[:10] labels = labels[:10] # 绘制图片 fig, axs = plt.subplots(1, 10, figsize=(15, 6)) for i in range(10): axs[i].imshow(images[i].squeeze(), cmap='gray') axs[i].set_title(str(labels[i])) axs[i].axis('off') plt.show()

绘制测试集前10个样本

show_images(test_loader)

选10张图像进行二值化

def binary(image, threshold): # 将灰度图像转成二值图像 binary_image = np.zeros_like(image) binary_image[image > threshold] = 1 return binary_image

二值化处理

images, labels = next(iter(test_loader)) binary_images = [] for image in images: binary_image = binary(image.squeeze(), 0.5) binary_images.append(binary_image) binary_images = np.array(binary_images)

绘制二值化后的图像

fig, axs = plt.subplots(1, 10, figsize=(15, 6)) for i in range(10): axs[i].imshow(binary_images[i], cmap='gray') axs[i].axis('off') plt.show()

边缘检测

kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]) edge_images = [] for binary_image in binary_images: # 使用2维卷积运算进行边缘检测 edge_image = cv2.filter2D(binary_image, -1, kernel) edge_images.append(edge_image) edge_images = np.array(edge_images)

绘制边缘检测后的图像

fig, axs = plt.subplots(1, 10, figsize=(15, 6)) for i in range(10): axs[i].imshow(edge_images[i], cmap='gray') axs[i].axis('off') plt.show()

降分辨率

image = images[0].squeeze().numpy() maxpool_image = cv2.resize(image, (14, 14), interpolation=cv2.INTER_MAX)

绘制降分辨率后的图像

fig, axs = plt.subplots(1, 2, figsize=(6, 3)) axs[0].imshow(image, cmap='gray') axs[0].set_title('Original Image') axs[0].axis('off') axs[1].imshow(maxpool_image, cmap='gray') axs[1].set_title('MaxPooling Image') axs[1].axis('off') plt.show()

升分辨率

upsample_image = cv2.resize(image, (56, 56), interpolation=cv2.INTER_LINEAR)

绘制升分辨率后的图像

fig, axs = plt.subplots(1, 2, figsize=(6, 3)) axs[0].imshow(image, cmap='gray') axs[0].set_title('Original Image') axs[0].axis('off') axs[1].imshow(upsample_image, cmap='gray') axs[1].set_title('Upsample Image') axs[1].axis('off') plt.show()

旋转与翻转

image = images[0].squeeze().numpy()

顺时针旋转90度

rotate_image1 = np.rot90(image, k=1)

顺时针旋转180度

rotate_image2 = np.rot90(image, k=2)

顺时针旋转270度

rotate_image3 = np.rot90(image, k=3)

上下翻转

flip_image1 = np.flipud(image)

左右翻转

flip_image2 = np.fliplr(image)

绘制旋转和翻转后的图像

fig, axs = plt.subplots(2, 3, figsize=(6, 6)) axs[0, 0].imshow(image, cmap='gray') axs[0, 0].set_title('Original Image') axs[0, 0].axis('off') axs[0, 1].imshow(rotate_image1, cmap='gray') axs[0, 1].set_title('Rotate 90 Degree') axs[0, 1].axis('off') axs[0, 2].imshow(rotate_image2, cmap='gray') axs[0, 2].set_title('Rotate 180 Degree') axs[0, 2].axis('off') axs[1, 0].imshow(rotate_image3, cmap='gray') axs[1, 0].set_title('Rotate 270 Degree') axs[1, 0].axis('off') axs[1, 1].imshow(flip_image1, cmap='gray') axs[1, 1].set_title('Flip Up-Down') axs[1, 1].axis('off') axs[1, 2].imshow(flip_image2, cmap='gray') axs[1, 2].set_title('Flip Left-Right') axs[1, 2].axis('off') plt.show()

扩展任务:读取二进制格式的Fashion-MNIST数据集

train_data = dsets.FashionMNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_data = dsets.FashionMNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True)

选择一张图像进行旋转

image = train_data.data[0].numpy().squeeze()

顺时针旋转45度

rotate_image = cv2.getRotationMatrix2D((14, 14), 45, 1) rotate_image = cv2.warpAffine(image, rotate_image, (28, 28))

绘制旋转后的图像

fig, axs = plt.subplots(1, 2, figsize=(6, 3)) axs[0].imshow(image, cmap='gray') axs[0].set_title('Original Image') axs[0].axis('off') axs[1].imshow(rotate_image, cmap='gray') axs[1].set_title('Rotate 45 Degree') axs[1].axis('off') plt.show(

实验内容:从本地文件夹中读取Fashion-MNIST数据以CSV格式读取训练集和测试集分别读取并构建Dataset。由第1步的Dataset生成Dataloader。遍历两次测试用的Dataloader每次以绘制出前10个样本并标出对应的类别名称。二值化:选10张图像进行二值化选择合适的阀值将每个像素用0或1表示。边缘检测:使用2维卷积运算对二值化后的10张图像进行处理实现边缘检测。降分辨率:任

原文地址: https://www.cveoy.top/t/topic/eCPD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录