实验内容:从本地文件夹中读取Fashion-MNIST数据以CSV格式读取训练集和测试集分别读取并构建Dataset。由第1步的Dataset生成Dataloader。遍历两次测试用的Dataloader每次以绘制出前10个样本并标出对应的类别名称。二值化:选10张图像进行二值化选择合适的阀值将每个像素用0或1表示。边缘检测:使用2维卷积运算对二值化后的10张图像进行处理实现边缘检测。降分辨率:任
导入需要的库
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(
原文地址: https://www.cveoy.top/t/topic/eCPD 著作权归作者所有。请勿转载和采集!