opencv增强数据集代码(文件夹图片)
时间: 2025-01-05 21:39:09 浏览: 4
OpenCV是一个开源计算机视觉库,它提供了一系列强大的图像处理和计算机视觉功能。如果你想增强图片数据集,通常会涉及到图像预处理、增强、裁剪、缩放等步骤。以下是一个简单的例子,展示如何使用OpenCV对文件夹中的图片进行基本操作:
```python
import cv2
import os
# 指定图片文件夹路径
data_folder = "path_to_your_image_folder"
for filename in os.listdir(data_folder):
# 加载图片
img = cv2.imread(os.path.join(data_folder, filename), cv2.IMREAD_COLOR)
# 图像增强处理,例如调整亮度、对比度
img_enhanced = cv2.convertScaleAbs(img, alpha=1.5, beta=50) # 这里alpha用于放大,beta用于加亮
# 可能的操作还包括灰度转换、色彩空间转换、噪声去除等
gray_img = cv2.cvtColor(img_enhanced, cv2.COLOR_BGR2GRAY)
# 保存增强后的图片
cv2.imwrite(os.path.join("enhanced_images_folder", filename), img_enhanced)
相关问题
opencv python怎么训练自己的数据集
训练自己的数据集需要以下步骤:
1. 准备数据集:将要训练的数据集按照类别进行分类,并将每个类别的图像放置在对应的文件夹中。
2. 创建标签文件:创建一个文本文件,每行包含图像路径和对应的标签,格式如下:
/path/to/image1.png 0
/path/to/image2.png 1
/path/to/image3.png 2
其中,0、1、2表示不同的类别。
3. 数据预处理:使用OpenCV读取图像,并进行预处理,如缩放、剪裁、增强等。
4. 构建模型:使用OpenCV的深度学习模块构建模型,可以选择现有的模型或自己设计模型。
5. 训练模型:使用训练数据集对模型进行训练,并对模型进行评估。
6. 测试模型:使用测试数据集对训练好的模型进行测试,并计算准确率、召回率等指标。
7. 预测结果:使用训练好的模型进行预测,得到分类结果。
示例代码:
```python
import cv2
import numpy as np
# 准备数据集
img_path = '/path/to/image.png'
label_path = '/path/to/label.txt'
# 读取标签文件
with open(label_path, 'r') as f:
lines = f.readlines()
labels = []
for line in lines:
path, label = line.strip().split()
labels.append(int(label))
# 数据预处理
img = cv2.imread(img_path)
img = cv2.resize(img, (224, 224))
# 构建模型
model = cv2.dnn.readNetFromCaffe(protoFile, caffeFile)
# 训练模型
model.train(img, np.array(labels))
# 测试模型
test_img_path = '/path/to/test/image.png'
test_label_path = '/path/to/test/label.txt'
with open(test_label_path, 'r') as f:
lines = f.readlines()
test_labels = []
for line in lines:
path, label = line.strip().split()
test_labels.append(int(label))
test_img = cv2.imread(test_img_path)
test_img = cv2.resize(test_img, (224, 224))
_, accuracy = model.evaluate(test_img, np.array(test_labels))
# 预测结果
result = model.predict(test_img)
```
LiTS2017数据集的路径为C:\Users\Administrator\Desktop\LiTS2017。 LiTS2017数据集里面包含Training Batch 1和Training Batch 2两个文件夹。Training Batch 1文件夹里面有图像,图像的拓展名为.nii。Training Batch 2文件夹里面有标签,标签拓展名为.nii。 请将我的LiTS2017数据集的3D图像变成2D、RGB三通道的png格式的图像。数据集的3D标签变成2D单通道的png格式标签。 并将其裁剪为单个肝脏区域。同时,移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片,对数据集进行增强操作,如旋转、翻转、缩放等,以扩充数据集,提高模型的泛化能力。 保存路径为C:\Users\Administrator\Desktop\2D-LiTS2017,帮我创建保存图像与标签的文件夹,并且将转换好的数据保存到对应的文件夹。
好的,我明白了你的要求。为了实现这个任务,需要使用Python编程语言和一些常用的科学计算库,如Numpy、SimpleITK、Pillow和OpenCV。以下是代码实现的步骤:
1. 导入所需的Python库。
```python
import os
import numpy as np
import SimpleITK as sitk
from PIL import Image
import cv2
```
2. 定义一些辅助函数,用于读取、保存和处理图像。
```python
def read_image(file_name):
# 读取.nii格式的图像文件
itk_image = sitk.ReadImage(file_name)
# 将图像转换为Numpy数组
np_array = sitk.GetArrayFromImage(itk_image)
return np_array
def save_image(image, file_name):
# 将Numpy数组转换为PIL图像
pil_image = Image.fromarray(image.astype(np.uint8))
# 保存为.png格式的图像文件
pil_image.save(file_name)
def normalize_image(image):
# 将图像像素值归一化到[0, 255]的范围
min_value = np.min(image)
max_value = np.max(image)
image = (image - min_value) / (max_value - min_value) * 255
return image.astype(np.uint8)
def crop_image(image, mask):
# 根据标签的位置将图像裁剪为单个肝脏区域
x, y, w, h = cv2.boundingRect(mask)
return image[y:y+h, x:x+w], mask[y:y+h, x:x+w]
def remove_small_regions(mask, threshold=0.02):
# 移除标签中面积占比小于2%的切片
n_slices = mask.shape[0]
for i in range(n_slices):
slice_mask = mask[i]
# 计算标签面积和整个切片面积
label_area = np.sum(slice_mask == 1)
total_area = slice_mask.size
# 如果标签面积占比小于阈值,则将该切片的标签移除
if label_area / total_area < threshold:
mask[i] = 0
return mask
def augment_image(image, mask):
# 对图像进行增强操作,如旋转、翻转、缩放等
# 这里可以根据需要添加多种增强方式
angle = np.random.randint(-10, 10)
scale = np.random.uniform(0.8, 1.2)
matrix = cv2.getRotationMatrix2D((image.shape[1]/2, image.shape[0]/2), angle, scale)
image = cv2.warpAffine(image, matrix, (image.shape[1], image.shape[0]), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REFLECT_101)
mask = cv2.warpAffine(mask, matrix, (mask.shape[1], mask.shape[0]), flags=cv2.INTER_NEAREST, borderMode=cv2.BORDER_REFLECT_101)
return image, mask
```
3. 读取LiTS2017数据集中的图像和标签,并进行处理。
```python
# 定义LiTS2017数据集的路径
data_path = "C:/Users/Administrator/Desktop/LiTS2017"
# 定义保存转换后的图像和标签的路径
save_path = "C:/Users/Administrator/Desktop/2D-LiTS2017"
os.makedirs(save_path, exist_ok=True)
# 读取Training Batch 1文件夹中的图像
image_path = os.path.join(data_path, "Training Batch 1")
image_files = sorted(os.listdir(image_path))
images = []
for file in image_files:
if file.endswith(".nii"):
file_name = os.path.join(image_path, file)
image = read_image(file_name)
# 将3D图像变成2D、RGB三通道的png格式的图像
image = normalize_image(image)
image = cv2.merge([image]*3)
images.append(image)
# 读取Training Batch 2文件夹中的标签
label_path = os.path.join(data_path, "Training Batch 2")
label_files = sorted(os.listdir(label_path))
labels = []
for file in label_files:
if file.endswith(".nii"):
file_name = os.path.join(label_path, file)
label = read_image(file_name)
# 将3D标签变成2D单通道的png格式标签
label = (label > 0).astype(np.uint8) * 255
labels.append(label)
# 将图像和标签进行裁剪和增强操作,并保存到对应的文件夹
for i in range(len(images)):
image = images[i]
label = labels[i]
# 将图像和标签裁剪为单个肝脏区域
image, label = crop_image(image, label)
# 移除标签中无肝脏的图片以及肝脏在图片中面积占比小于2%的切片
label = remove_small_regions(label)
# 对图像进行增强操作
for j in range(5):
new_image, new_label = augment_image(image.copy(), label.copy())
# 保存图像和标签
image_file_name = os.path.join(save_path, "image_{}_{}.png".format(i, j))
label_file_name = os.path.join(save_path, "label_{}_{}.png".format(i, j))
save_image(new_image, image_file_name)
save_image(new_label, label_file_name)
```
这段代码会将LiTS2017数据集中的图像和标签转换为2D、RGB三通道的png格式的图像和2D单通道的png格式标签,并进行裁剪和增强操作,最后保存到指定的文件夹中。注意,这个任务可能需要一些时间和计算资源。
阅读全文