基于Python的图像分类-数据集增强代码展示

本项目主要用于提交和展示你们完善的数据集增强代码

请把各个效果(翻转、旋转、位移等)操作效果都展示一遍)

提供图像400*267像素

 记得改名

import cv2
import math
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

def DotMatrix(A,B):
    '''
    A,B:需要做乘法的两个矩阵,注意输入矩阵的维度ndim是否满足乘法要求(要做判断)
    '''
    
    return np.matmul(A,B)

class Img:
    def __init__(self,image,rows,cols,center=[0,0]):
        self.src=image #原始图像
        self.rows=rows #原始图像的行
        self.cols=cols #原始图像的列
        self.center=center #旋转中心,默认是[0,0]
        self.rotate = False

    def Move(self,delta_x,delta_y):      
        '''
        本函数处理生成做图像平移的矩阵
        '''
        self.transform=np.array([[1,0,delta_x],[0,1,delta_y],[0,0,1]])
        self.rotate = False

    def Zoom(self,factor):               #缩放
        #factor>1表示缩小;factor<1表示放大
        self.transform=np.array([[factor,0,0],[0,factor,0],[0,0,factor]])
        self.rotate = False
    def Horizontal(self):                
        '''水平镜像 
        镜像的这两个函数,因为原始图像读进来后是height×width×3,和我们本身思路width×height×3相反
        所以造成了此处水平镜像和垂直镜像实现的效果是反的'''
        self.transform=np.array([[-1,0,self.rows],[0,1,0],[0,0,1]])      
        self.rotate = False

    def Vertically(self):                
        #垂直镜像,注意实现原理的矩阵和最后实现效果是和水平镜像是反的
        self.transform=np.array([[1,0,0],
                                [0,-1,self.cols],
                                [0,0,1]])
        self.rotate = False


    def Rotate(self,beta):               # 旋转
                                         # beta>0表示逆时针旋转;beta<0表示顺时针旋转
        self.transform=np.array([[math.cos(beta),-math.sin(beta),0],
                                 [math.sin(beta), math.cos(beta),0],
                                 [    0,              0,         1]])
        self.rotate =True
    def Process(self):
        if self.rotate:
            self.center=[int(self.rows/2),int(self.cols/2)] 
        #初始化定义目标图像,具有3通道RBG值
        self.dst=np.zeros((self.rows,self.cols,3),dtype=np.uint8)

        #提供for循环,遍历图像中的每个像素点,然后使用矩阵乘法,找到变换后的坐标位置
        for i in range(self.rows):
            for j in range(self.cols):
                
                src_pos=np.array([i-self.center[0],j-self.center[1],1])#设置原始坐标点矩阵
                [x,y,z]=DotMatrix(self.transform,src_pos)#和对应变换做矩阵乘法
                
                x=int(x)+self.center[0]
                y=int(y)+self.center[1]

                if x>=self.rows or y>=self.cols or x<0 or y<0:
                    self.dst[i][j]=255 #处理未落在原图像中的点的情况
                else:
                    self.dst[i][j]=self.src[x][y]#使用变换后的位置

if __name__=='__main__':
    
    infer_path=r'sample_picture.jpg'#要处理的单个图片地址
    imgv = Image.open(infer_path)#打开图片
    plt.imshow(imgv) #根据数组绘制图像
    plt.show() #显示图像
    
    rows = imgv.size[1]
    cols = imgv.size[0]
    print(rows,cols)#注意此处rows和cols的取值方式
    
    imgv=np.array(imgv)#从图像生成数组
    img=Img(imgv,rows,cols,[0,0])#生成一个自定Img类对象[0,0]代表处理的中心点
    


    img.Vertically() #选择处理矩阵
    img.Process()#进行矩阵变换
    img2=Image.fromarray(img.dst)#从处理后的数组生成图像
    plt.imshow(img2)
    print("水平翻转")
    plt.show()


    img.Horizontal() #选择处理矩阵
    img.Process()#进行矩阵变换
    img2=Image.fromarray(img.dst)#从处理后的数组生成图像
    plt.imshow(img2)
    print("垂直翻转")
    plt.show()


    img.Rotate(math.radians(180)) #选择处理矩阵
    img.Process()#进行矩阵变换
    img2=Image.fromarray(img.dst)#从处理后的数组生成图像
    plt.imshow(img2)
    print("旋转")
    plt.show()


    img.Move(-50,-50) #选择处理矩阵
    img.Process()#进行矩阵变换
    img2=Image.fromarray(img.dst)#从处理后的数组生成图像
    plt.imshow(img2)
    print("平移")
    plt.show()

    img.Zoom(0.5) #选择处理矩阵
    img.Process()#进行矩阵变换
    img2=Image.fromarray(img.dst)#从处理后的数组生成图像
    plt.imshow(img2)
    print("放缩")
    plt.show()
    
    '''
    img.Vertically() #镜像(0,0)
    img.Horizontal() #镜像(0,0)
    img.Rotate(math.radians(180))  #旋转点选择图像大小的中心点
    img.Move(-50,-50) #平移
    img.Zoom(0.5) #缩放
    '''

结果

<Figure size 432x288 with 1 Axes>
267 400
水平翻转

<Figure size 432x288 with 1 Axes>
垂直翻转

<Figure size 432x288 with 1 Axes>
旋转

<Figure size 432x288 with 1 Axes>
平移

<Figure size 432x288 with 1 Axes>
放缩

<Figure size 432x288 with 1 Axes>
  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
很抱歉,我之前的回答有误。RNN 确实不适用于图像分类任务,CNN 是更好的选择。以下是使用 CNN 实现猫狗分类Python 代码,供您参考: ```python # 导入必要的库 import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 定义常量 BATCH_SIZE = 32 IMG_SIZE = (224, 224) EPOCHS = 10 # 数据增强 train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') train_generator = train_datagen.flow_from_directory( directory='train/', target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='binary') val_datagen = ImageDataGenerator(rescale=1./255) val_generator = val_datagen.flow_from_directory( directory='val/', target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='binary') # 构建模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(256, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(train_generator, epochs=EPOCHS, validation_data=val_generator) # 评估模型 model.evaluate(val_generator) ``` 在上面的代码中,我们使用了 TensorFlow 和 Keras 库来构建和训练 CNN 模型。我们使用猫狗分类数据集,其中包含训练集和验证集,分别存放在 `train/` 和 `val/` 文件夹中。我们使用 `ImageDataGenerator` 对数据进行数据增强,以提高模型的泛化能力。然后,我们构建了一个简单的 CNN 模型,使用 `compile()` 编译模型,然后使用 `fit()` 方法训练模型。最后,我们使用 `evaluate()` 方法评估模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值