【脚本】参考链接解决问题:libpng warning: iCCP: known incorrect sRGB profile(主要是因为cv2读取有些png格式出现的问题)

参考链接

代码

  • cleardata:可以将传进来的yolov5的标签txt中的类别数统计出来
  • removeiCCPWarn:将单个文件中的png图像消除iCCP影响再存入新的文件夹
  • removeiCCPWarn_root:传入root目录,里面包含了子文件夹
import os
import cv2
from tqdm import tqdm
from skimage import io

classnames = ['nest', 'kite', 'balloon', 'trash']
# 1.{'nest': 2955, 'kite': 508, 'balloon': 519, 'trash': 535} G:\pycharmprojects\yoloair-iscyy-beta\datasets\A_linepaste_trash_png_2\images
#   2016张 * 4
#   {'nest': 0, 'kite': 672, 'balloon': 672, 'trash': 672} 添加两个obj G:\pycharmprojects\ScriptCodes_lwd\linepaste\save\save_7\images
#   {'nest': 0, 'kite': 672, 'balloon': 672, 'trash': 672} 左右翻转 G:\pycharmprojects\ScriptCodes_lwd\linepaste\save\save_7\save\save_1_lrflip
#   {'nest': 0, 'kite': 672, 'balloon': 672, 'trash': 672} 左右翻转+黑块 G:\pycharmprojects\ScriptCodes_lwd\linepaste\save\save_7\save\save_2_lrflipblock
#   {'nest': 0, 'kite': 672, 'balloon': 672, 'trash': 672} 提高对比度+加高斯噪声(mean=0, sigma=0.08) G:\pycharmprojects\ScriptCodes_lwd\linepaste\save\save_7\save\save_3_noise
# 扩充后总共: {'nest': 2955, 'kite': 3196, 'balloon': 3207, 'trash': 3223}

# 2.{'nest': 6822, 'kite': 1455, 'balloon': 1552, 'trash': 1455}
# 3.{'nest': 4487, 'kite': 834, 'balloon': 834, 'trash': 822}
#   {'nest': 516, 'kite': 88, 'balloon': 87, 'trash': 85}

def iCCPwran(image_dir):
    imagefiles = os.listdir(image_dir)
    for file in imagefiles:
        image = cv2.imread(os.path.join(image_dir, file))
        print(file)


def cleardata(rootdir): # 输入的是labels_train_dir
    # 统计类别数
    datadict = dict()
    for name in classnames:
        datadict[name] = 0

    # 获取到txt文本每行的内容
    txtfiles = os.listdir(rootdir)
    for txtfile in tqdm(txtfiles):
        with open(os.path.join(rootdir, txtfile), 'r') as f:
            data = f.read().strip().split()
            clsindex = int(data[0])
            datadict[classnames[clsindex]] += 1
    return datadict

# 消除png的iCCP影响
def removeiCCPWarn(png_imagesdir, savedir):
    assert os.path.exists(png_imagesdir), f'{
      
      png_imagesdir} not exists.'
    if not os.path.exists(savedir):
        os.makedirs(savedir)

    filelist = os.listdir(png_imagesdir)
    for file in tqdm(filelist):
        image = io.imread(os.path.join(png_imagesdir, file))
        image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGRA)
        cv2.imencode('.png', image)[1].tofile(os.path.join(savedir, file))


def removeiCCPWarn_root(png_imagesrootdir, saverootdir):
    if not os.path.exists(saverootdir):
        os.makedirs(saverootdir)

    # 因为子文件下有train val test三个任务目录,所以多了这个函数
    testsets = os.listdir(png_imagesrootdir)
    for test in testsets:
        png_imagesdir = os.path.join(png_imagesrootdir, test)
        savedir = os.path.join(saverootdir, test)
        removeiCCPWarn(png_imagesdir, savedir)



if __name__ == '__main__':
    # image_dir = r'G:\pycharmprojects\yoloair-iscyy-beta\datasets\A_linepaste_trash_png\images\train'
    # iCCPwran(image_dir)

    # rootdir = r'G:\A_lwd_paper\lintrash_datasets\labels'
    # datadict = cleardata(rootdir)
    # print(datadict)

    # -------------------2. 传入root目录,里面包含了子文件夹--------------- #
    png_imagesrootdir = r'G:\A_lwd_paper\lintrash_datasets\A_data\images'  # 只有train
    saverootdir = r'G:\A_lwd_paper\lintrash_datasets\A_data\images_noiCCP'
    removeiCCPWarn_root(png_imagesrootdir, saverootdir)

    # -------------------1. 传入单个目录,里面没有包含子文件夹--------------- #
    # png_imagesdir = r'G:\pycharmprojects\yoloair-iscyy-beta\datasets\A_linepaste_trash_png_2\images\val'
    # savedir = r'G:\pycharmprojects\yoloair-iscyy-beta\datasets\A_linepaste_trash_png_2\images_iCCP'
    # removeiCCPWarn(png_imagesdir, savedir)

猜你喜欢

转载自blog.csdn.net/LWD19981223/article/details/127538225