数据集图片RGB颜色通道乱序实现数据集扩充

背景:

制作好自己yolo格式的数据集后,由于其数据量比较小只有357张照片,且数据集中的目标颜色特征明显,于是考虑RGB通道互换使数据集扩充至三倍,同时使images和labels中jpg文件和txt文件仍保持一一对应;
转换前:
在这里插入图片描述
在这里插入图片描述
转换后(两张图片test用):
在这里插入图片描述
在这里插入图片描述

一、思路:

1.OpenCV读取图片

1.1 简述
  OpenCV读取图片的方法是cv2.imread(),读取出来图片的格式是BGR与常规的彩色图像的格式(RGB)相反,这一点一定要注意。
  OpenCV显示图片的方法是cv2.imshow(),显示的格式是BGR。

2. OpenCV保存图片

2.1 简述
  OpenCV保存图片用cv.imwrite(filename, img),filename为保存的路径名称,img为要保存的图片。
  需要注意如下几点:
    1. cv2保存的共三个维度(高,宽,通道)。
    2. 保存的图片格式也是BGR。
    3. 将numpy转为np.uint8格式

3.OpenCV图像的保存(cv2.imwrite)

函数 cv2.imwrite() 用于将图像保存到指定的文件。

(1)函数说明)

retval = cv2.imwrite(filename, img [, paras])
  • cv2.imwrite() 将 OpenCV 图像保存到指定的文件。
  • cv2.imwrite() 基于保存文件的扩展名选择保存图像的格式。
  • cv2.imwrite() 只能保存 BGR 3通道图像,或 8 位单通道图像、或 PNG/JPEG/TIFF 16位无符号单通道图像。

(2)参数说明

  • filename:要保存的文件的路径和名称,包括文件扩展名
  • img:要保存的 OpenCV 图像,nparray 多维数组
  • paras:不同编码格式的参数,可选项
  • cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高
  • cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
  • cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大
  • retval:返回值,保存成功返回 True,否则返回 False

二、代码实现

1.python复制和移动文件(并重命名)

复制文件 :shutil.copy()

shutil.copy('文件名',‘目的文件夹) 复制到目的文件夹下面

shutil.copy('文件名',‘目的文件夹/新文件名’) 复制到目的文件夹下面,之后重命名

移动文件 :shutil.move()

shutil.move('文件名',‘目的文件夹) 移动到目的文件夹下面

shutil.move('文件名',‘目的文件夹/新文件名’) 移动到目的文件夹下面,之后重命名

# 引入shutil模块
import shutil
# 复制或移动到目的文件夹下面
# 如果只写目标文件夹的名称的话,如果目标文件夹不存在,则会将复制或移动之后的文件重命名为目标文件夹的名称
# demo.txt 复制到 新的文件夹 下面
shutil.copy('demo.txt','新的文件夹')
# file1.txt 移动到 新的文件夹 下面
shutil.move('file1.txt','新的文件夹')
# 复制或移动到目的文件夹下面之后,重命名
# 如果目标文件夹不存在,则会报错
# demo.txt 复制到 新的文件夹 下面,并重命名为new1.txt
shutil.copy('demo.txt','新的文件夹/new1.txt')
# file2.txt 移动到 新的文件夹 下面,并重命名为 new2.txt
shutil.move('file2.txt','新的文件夹/new2.txt')

复制和移动文件,如果目的文件夹不存在,或者要复制和移动的文件不存在,则都会报错。

复制和移动对于移动到的文件夹下面是否存在同名文件,处理结果不同。如果同名文件存在,文件可以成功复制,并覆盖目标文件。而移动文件的话,同名文件存在,则报错。

# 建议在复制或移动之前做相应判断
if os.path.exists('新的文件夹'):
    shutil.copy('demo.txt','新的文件夹')
else:
    print('目的文件夹不存在,无法复制')
if os.path.exists('新的文件夹'):
    shutil.move('file1.txt','新的文件夹')
else:
    print('目的文件夹不存在,无法移动')

2.CV-颜色通道转换

(1)库的调用

import matplotlib.pyplot as plt
import cv2

(2)图片的读入

img=cv2.imread('F:cat.jpg')

(3)原图的bgr三个通道分离以及rgb顺序显示的合成

b,g,r=cv2.split(img)
img_rgb=cv2.merge([r,g,b])

对于rgb读取转换为bgr显示的3种方法:

#方法1
img_rgb1=cv2.merge([R,G,B])
 
#方法2
imgrgb2=cv2.cvtColor(img,cv.COLOR_BGR2RGB)
 
#方法3
img_rgb3=img[:,:,::-1]

三、示例代码

import cv2
import os
import re
from glob import glob
import shutil
from numpy import TooHardError

dir = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/data/images/"#转换后图片保存位置
ray_path = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/test/images/"#原始图片位置

labels_dir = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/data/labels/"#转换后图片label保存位置
ray_labels_path = "/media/innox/723E943C3E93F777/datasets_tranfer/yolo_end/test/labels/"#原始图片labels位置

frames = glob(os.path.join(ray_path, '*.jpg'))

for i, frame in enumerate(frames):
    pattern = re.compile(r'([^<>/\\\|:""\*\?]+)\.\w+$')
    data = pattern.findall(frame)
    data_now = data[0]
    Newdir = os.path.join(ray_path, str(data_now) + '.jpg')
    img = cv2.imread(Newdir)
    # print(Newdir)
    B, G, R = cv2.split(img) #openCV切分为BGR三个通道
    img_GRB = cv2.merge([G, R, B])#重定义为GRB顺序
    img_RGB = cv2.merge([R, G, B])#重定义为RGB顺序
    img_BGR = cv2.merge([B, G, R])#重定义为BGR顺序


    
    lablename= Newdir.split("/")[-1]#获取图片的名字(含文件名后缀)
    # print(lablename)
    lablename = lablename.split(".")[0]#获取图片的名字(不含文件名后缀)
    # print(lablename)
    labelpath = os.path.join(ray_labels_path,lablename)#获取该图片labels的完整路径
    all_dir = labelpath+'.txt'
    print(all_dir)
        
    if os.path.exists(all_dir):  #判断该图片在labels路径下是否有对应的label
        # os.rename(labelpath+'.txt',labelpath+'_RGB'+'.txt')#如果有,就在它移动之后重命名操作
        shutil.copyfile(all_dir,labels_dir + lablename + '_RGB.txt') 
        shutil.copyfile(all_dir,labels_dir + lablename + '_BGR.txt') 
        shutil.copyfile(all_dir,labels_dir + lablename + '_GRB.txt') 
    else:
        print("The file does not exist")
      
    name_GRB = str(data_now) + "_GRB"+".jpg"   
     
    name_RGB = str(data_now) + "_RGB"+".jpg"
    
    name_BGR = str(data_now) + "_BGR"+".jpg"
    
    
    cv2.imwrite(dir + name_GRB, img_GRB)
    
    cv2.imwrite(dir + name_RGB, img_RGB)
    
    cv2.imwrite(dir + name_BGR, img_BGR)

参考链接:
1.Python-OpenCV读取与保存图片

猜你喜欢

转载自blog.csdn.net/weixin_48936263/article/details/124633849