批量转移文件,并修改图片的位深度、灰度等信息

本文依然是深度学习中,训练数据制作中所要用到的工具类方法。

1 批量转移文件

即:将labelme转换得到多个json命名的文件夹中的散落的图片,批量转移到同一个文件,此处针对png格式图片文件。
代码使用采用C++和QT写的,因为时间比较紧迫,就用的以前写的代码改的,现在想想如果用python来写,应该非常简单,以后有时间再写吧,先用着。

void Copyfile()
{
	QString path = "D:/DataTrans/TrainData";
	//判断路径是否存在
	QDir dir(path);
	if (!dir.exists())
	{
		//ui.label->setText(QString::number(1.23));
		return;
	}

	//获取所选文件类型过滤器
	QStringList filters;
	filters << QString("*.png");

	//定义迭代器并设置过滤器
	QDirIterator dir_iterator(path,
		filters,
		QDir::Files | QDir::NoSymLinks,
		QDirIterator::Subdirectories);
	QStringList string_list;
	while (dir_iterator.hasNext())
	{
		dir_iterator.next();
		QFileInfo file_info = dir_iterator.fileInfo();
		QString absolute_file_path = file_info.absoluteFilePath();
		string_list.append(absolute_file_path);
	}
	//ui.label->setText(string_list.at(0));
	int num_Img = 0;
	int num_Label = 0;
	for (int i = 0; i < string_list.count(); i++)
	{
		std::string Path = string_list.at(i).toStdString();
		std::string m_flieName;
		size_t start = Path.find_last_of("/");
		if (start != std::string::npos)
		{
			size_t end = Path.find_last_of(".");

			if (end != std::string::npos)
			{
				m_flieName = Path.substr(start + 1, end - start - 1);
			}
		}
		if (m_flieName == "img")
		{
			USImage1.load(string_list.at(i));
			QString name = QString::number(num_Img);
			name = "D:/DataTrans/TrainData/image/" + name + ".png";
			USImage1.save(name, "PNG", 1);
			num_Img = num_Img + 1;
		}
		if (m_flieName == "label")
		{
			USImage1.load(string_list.at(i));
			QString name = QString::number(num_Label);
			name = "D:/DataTrans/TrainData/label/" + name + ".png";
			USImage1.save(name, "PNG", 1);
			num_Label = num_Label + 1;
		}
	}
}

2 修改图片位深度等参数

使用深度学习进行训练时,训练数据图片的位深度和通道等参数必须要设置正确,否者得不到想要的模型和预测功能。

2.1 查看图片的各自参数

python代码如下:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('D:/IMG/test8/13.png'))  #打开图像并转化为数字矩阵
plt.imshow(img)
plt.axis('off')
plt.show()
print (img.shape)  
print (img.dtype )
print (img.size) 
print (type(img))
print (img.shape[0])
print (img.shape[1])
print (img.shape[2])

其中,shape是显示矩阵的维度,即图片的维度,可以看出图片的通道数;dtype可以看出图片的数据格式,大概就这些。

2.2 修改图片参数

采用python实现:

import os
import glob
import cv2
import numpy as np

def togrey(img,outdir):
    src = cv2.imread(img) 
    try:
        gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)#彩色图像转灰度,即24位深度转8位深度
        cropped = gray[69:581, 26:538]  # 裁剪坐标为[y0:y1, x0:x1]
        #保存
        cv2.imwrite(os.path.join(outdir,os.path.basename(img)), cropped)
        #设置阈值,标签数据转灰度图像
        img255 = np.zeros_like(cropped, dtype='uint8')
        for i in range(cropped.shape[0]):
            for j in range(cropped.shape[1]):
                if cropped[i, j] > 0: #自己定
                      img255[i, j] = 255
        #保存
        cv2.imwrite(os.path.join(outdir,os.path.basename(img)), img255)
    except Exception as e:
        print(e)

for file in glob.glob('D:/IMG/*.png'):  
    togrey(file,'D:/IMG/New/')

使用python实现了遍历文件夹、彩色图像转灰度图像、裁剪图像或resize图像尺寸、设置阈值将label图片转换为二值化图片,确实非常简单。

3 到此

到此训练数据的制作就完成了,可以拿去训练自己的神经网络了。

你可能感兴趣的:(深度学习)