飞道的博客

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

445人阅读  评论(0)

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

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


  
  1. import cv2
  2. import math
  3. import numpy as np
  4. from PIL import Image
  5. import matplotlib.pyplot as plt
  6. def DotMatrix(A,B):
  7. '''
  8. A,B:需要做乘法的两个矩阵,注意输入矩阵的维度ndim是否满足乘法要求(要做判断)
  9. '''
  10. return np.matmul(A,B)
  11. class Img:
  12. def __init__(self,image,rows,cols,center=[0,0]):
  13. self.src=image #原始图像
  14. self.rows=rows #原始图像的行
  15. self.cols=cols #原始图像的列
  16. self.center=center #旋转中心,默认是[0,0]
  17. self.rotate = False
  18. def Move(self,delta_x,delta_y):
  19. '''
  20. 本函数处理生成做图像平移的矩阵
  21. '''
  22. self.transform=np.array([[ 1, 0,delta_x],[ 0, 1,delta_y],[ 0, 0, 1]])
  23. self.rotate = False
  24. def Zoom(self,factor): #缩放
  25. #factor>1表示缩小;factor<1表示放大
  26. self.transform=np.array([[factor, 0, 0],[ 0,factor, 0],[ 0, 0,factor]])
  27. self.rotate = False
  28. def Horizontal(self):
  29. '''水平镜像
  30. 镜像的这两个函数,因为原始图像读进来后是height×width×3,和我们本身思路width×height×3相反
  31. 所以造成了此处水平镜像和垂直镜像实现的效果是反的'''
  32. self.transform=np.array([[ -1, 0,self.rows],[ 0, 1, 0],[ 0, 0, 1]])
  33. self.rotate = False
  34. def Vertically(self):
  35. #垂直镜像,注意实现原理的矩阵和最后实现效果是和水平镜像是反的
  36. self.transform=np.array([[ 1, 0, 0],
  37. [ 0, -1,self.cols],
  38. [ 0, 0, 1]])
  39. self.rotate = False
  40. def Rotate(self,beta): # 旋转
  41. # beta>0表示逆时针旋转;beta<0表示顺时针旋转
  42. self.transform=np.array([[math.cos(beta),-math.sin(beta), 0],
  43. [math.sin(beta), math.cos(beta), 0],
  44. [ 0, 0, 1]])
  45. self.rotate = True
  46. def Process(self):
  47. if self.rotate:
  48. self.center=[int(self.rows/ 2),int(self.cols/ 2)]
  49. #初始化定义目标图像,具有3通道RBG值
  50. self.dst=np.zeros((self.rows,self.cols, 3),dtype=np.uint8)
  51. #提供for循环,遍历图像中的每个像素点,然后使用矩阵乘法,找到变换后的坐标位置
  52. for i in range(self.rows):
  53. for j in range(self.cols):
  54. src_pos=np.array([i-self.center[ 0],j-self.center[ 1], 1]) #设置原始坐标点矩阵
  55. [x,y,z]=DotMatrix(self.transform,src_pos) #和对应变换做矩阵乘法
  56. x=int(x)+self.center[ 0]
  57. y=int(y)+self.center[ 1]
  58. if x>=self.rows or y>=self.cols or x< 0 or y< 0:
  59. self.dst[i][j]= 255 #处理未落在原图像中的点的情况
  60. else:
  61. self.dst[i][j]=self.src[x][y] #使用变换后的位置
  62. if __name__== '__main__':
  63. infer_path= r'sample_picture.jpg' #要处理的单个图片地址
  64. imgv = Image.open(infer_path) #打开图片
  65. plt.imshow(imgv) #根据数组绘制图像
  66. plt.show() #显示图像
  67. rows = imgv.size[ 1]
  68. cols = imgv.size[ 0]
  69. print(rows,cols) #注意此处rows和cols的取值方式
  70. imgv=np.array(imgv) #从图像生成数组
  71. img=Img(imgv,rows,cols,[ 0, 0]) #生成一个自定Img类对象[0,0]代表处理的中心点
  72. img.Vertically() #选择处理矩阵
  73. img.Process() #进行矩阵变换
  74. img2=Image.fromarray(img.dst) #从处理后的数组生成图像
  75. plt.imshow(img2)
  76. print( "水平翻转")
  77. plt.show()
  78. img.Horizontal() #选择处理矩阵
  79. img.Process() #进行矩阵变换
  80. img2=Image.fromarray(img.dst) #从处理后的数组生成图像
  81. plt.imshow(img2)
  82. print( "垂直翻转")
  83. plt.show()
  84. img.Rotate(math.radians( 180)) #选择处理矩阵
  85. img.Process() #进行矩阵变换
  86. img2=Image.fromarray(img.dst) #从处理后的数组生成图像
  87. plt.imshow(img2)
  88. print( "旋转")
  89. plt.show()
  90. img.Move( -50, -50) #选择处理矩阵
  91. img.Process() #进行矩阵变换
  92. img2=Image.fromarray(img.dst) #从处理后的数组生成图像
  93. plt.imshow(img2)
  94. print( "平移")
  95. plt.show()
  96. img.Zoom( 0.5) #选择处理矩阵
  97. img.Process() #进行矩阵变换
  98. img2=Image.fromarray(img.dst) #从处理后的数组生成图像
  99. plt.imshow(img2)
  100. print( "放缩")
  101. plt.show()
  102. '''
  103. img.Vertically() #镜像(0,0)
  104. img.Horizontal() #镜像(0,0)
  105. img.Rotate(math.radians(180)) #旋转点选择图像大小的中心点
  106. img.Move(-50,-50) #平移
  107. img.Zoom(0.5) #缩放
  108. '''

结果

<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>

转载:https://blog.csdn.net/aiqq136/article/details/117305794
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场