データ セットの拡張を実現するために、データ セット イメージの RGB カラー チャネルが正しくありません。

バックグラウンド:

yolo 形式で独自のデータセットを作成した後、データ量が比較的少なく、写真も 357 枚しかなく、データセット内のターゲット色の特徴が明らかであるため、データセットを 3 倍にするために RGB チャネルのスワップを検討します。同時に画像とラベルを作成します jpg ファイルと txt ファイルは 1 対 1 の対応を維持します;
変換前:
ここに画像の説明を挿入
ここに画像の説明を挿入
変換後 (テスト用に 2 枚の写真):
ここに画像の説明を挿入
ここに画像の説明を挿入

1. 感想:

1. OpenCVは画像を読み取ります

1.1 簡単な紹介
  OpenCV が画像を読み取る方法は、cv2.imread()読み取られる画像の形式が従来のカラー画像形式 (RGB) とは逆の BGR であることに注意する必要があります。
  OpenCV で画像を表示する方法は、cv2.imshow()表示形式が BGR であることです。

2. OpenCVのイメージ保存

2.1 簡単な説明
  OpenCV は画像の保存に使用されますcv.imwrite(filename, img)。filename は保存されたパスの名前、img は保存される画像です。
  以下の点に注意してください。
    1. Cv2 は、合計 3 つの次元 (高さ、幅、チャネル) を保存します。
    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 を返します。

2. コードの実装

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) 元画像の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]

3. コード例

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