本科毕设的方向是图像修复,但是本人是其实自动化专业的,opencv在此之前完全没有接触过,csdn代码太杂了,对于本若至来说理解困难,也尝试来B站找过教程但无奈没什么收获,从头开始学习时间成本太大。所以这是一篇结合了大量chatgpt回答的文章。
个人在整个过程中一直卡壳的地方是如何批量处理,赶进度太难了。
本教程可能存在大量冗余的步骤,可以提出但别笑我。
首先你要下载两个数据集,一个是未受损的图像数据集,一个是掩码数据集。数据集相关内容百度可以搜到很多。
将两个数据集进行批量重命名。代码参考:
(此处生成的是用0填充五位数字,因为我的数据集图片数量是五位数)
import os
path_name=r'你的数据集文件地址'
count=os.listdir(path_name)
for i in range(0,len(count)):#进入到文件夹内,对每个文件进行循环遍历
j=0#表示图像名称从0开始
k = str(i+j)
other_url = k.zfill(5)#总共4位,除了数字部位,其余用0填充
#os.path.join(path_name,item)表示找到每个文件的绝对路径并进行拼接操作
os.rename(os.path.join(path_name,count[i]),os.path.join(path_name,(other_url+'.png')))
j+=1
print("Rename_Successed")
将两个数据集的图像进行批量改尺寸,尺寸需要一致。
此处尺寸是256×256,如果原图尺寸比例不同会被压缩成正方形。代码如下:
import os
import CV2
from PIL import Image
import os
def resize_images(input_folder, output_folder):
# 创建一个存放修改后图片的文件夹
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(input_folder):
if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".bmp") or filename.endswith(".gif"):
img = Image.open(os.path.join(input_folder, filename)) # 打开输入文件夹中的图像文件
# 以下两个功能选择使用
# 简单粗暴直接调整图片大小为固定值
new_size = (256, 256) # 例如:(800, 600) 宽度为800,高度为600
img_resized = img.resize(new_size) # 将图像大小调整为指定的大小
img_resized.save(os.path.join(output_folder, filename)) # 将调整后的图像保存到输出文件夹中
input_folder = r"你的数据集地址"
output_folder = r"裁剪后保存的地址"
# 执行函数resize_images,调整图片大小并保存到输出文件夹中
resize_images(input_folder, output_folder)
如果你的掩码数据集的黑色部分不是透明底而是纯纯的黑色,那么在这一步可以将它转为透明底。代码如下:
import os
from PIL import Image
# 设置要处理的文件夹路径
input_folder = r'不透明的掩码数据集文件地址'
output_folder = r'透明底掩码数据集文件地址'
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
# 检查文件是否为 PNG 图像文件
if filename.endswith('.png'):
# 打开图像文件
img_path = os.path.join(input_folder, filename)
img = Image.open(img_path)
# 获取图像的 RGBA 模式
img = img.convert('RGBA')
# 创建一个 data 列表,将黑色部分(RGB = (0, 0, 0))的 alpha 通道设为 0 (透明)
data = []
for pixel in img.getdata():
if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0:
data.append((0, 0, 0, 0))
else:
data.append(pixel)
# 更新图像的像素数据
img.putdata(data)
# 保存处理后的图像
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f'Processed {filename}')
然后就可以将两个数据集叠加啦,代码如下:
import os
from PIL import Image
# 设置要处理的文件夹路径
train_folder = '训练集文件夹'
mask_folder = '透明底掩码文件夹'
output_folder = '输出文件夹'
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历训练集文件夹中的所有文件
for filename in os.listdir(train_folder):
# 检查文件是否为 PNG 图像文件
if filename.endswith('.png'):
# 拼接掩码图像的文件名
mask_filename = os.path.splitext(filename)[0] + '.png'
mask_path = os.path.join(mask_folder, mask_filename)
train_path = os.path.join(train_folder, filename)
print(f"Train image path: {train_path}")
print(f"Mask image path: {mask_path}")
# 检查掩码文件是否存在
if not os.path.exists(mask_path):
print(f'Error: {mask_path} does not exist. Skipping {filename}.')
continue
# 打开训练集图像文件
train_img = Image.open(train_path)
# 获取训练集图像的尺寸
width, height = train_img.size
# 打开掩码图像文件
mask_img = Image.open(mask_path)
# 调整掩码图像的大小以匹配训练集图像
mask_img = mask_img.resize((width, height), resample=Image.NEAREST)
# 将掩码图像叠加在训练集图像上
train_img.paste(mask_img, (0, 0), mask_img)
# 保存处理后的图像
output_path = os.path.join(output_folder, filename)
train_img.save(output_path)
print(f'Processed {filename}')
之后就可以得到叠加的图像啦~终于迈出第一步