基于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>
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值