引 言 在图像风格迁移任务中,近几年比较火热的Generative Adversarial Nets (GAN)模型以及各种变体深受视觉研究团体的青睐,在具体任务中取得比较不错的实验表现。在有监督图像风格迁移任务迁移中,需要输入给模型成对的图片(一个来自源域source domain,一个来自目标域target domain)。成对图像底层内容可以相同,pix2pix模型主要研究这类图像集合,图像底层内容也可以不同,CycleGAN模型主要解决底层内容不同的风格迁移问题。在图像输入模型前需要对图像进行预处理,可以将两个领域的图像拼接成一张图作为模型的输入。本文主要讲述两个用于图像拼接处理的代码。代码来源于文章【Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks】[paper] [Project code]
文章目录
- 一、PIL库实现图像拼接
- 二、cv2库实现图像拼接
- 三、总结
一、PIL库实现图像拼接
图像拼接的前提条件是两张图具有相同的尺寸,若尺寸不同需要采用缩放、裁剪等策略对图像进行预处理。调用Image.new(mode, size)
创建拼接图,通过 paste()
函数将两张图片粘贴到指定位置。
示例代码:
def align_images(a_file_paths, b_file_paths, target_path):if not os.path.exists(target_path):os.makedirs(target_path,exist_ok=True)for i in range(len(a_file_paths)):img_a = Image.open(a_file_paths[i])img_b = Image.open(b_file_paths[i])assert(img_a.size == img_b.size)aligned_image = Image.new("RGB", (img_a.size[0] * 2, img_a.size[1]))aligned_image.paste(img_a, (0, 0))aligned_image.paste(img_b, (img_a.size[0], 0))aligned_image.save(os.path.join(target_path, '{:04d}.jpg'.format(i)))if __name__ == '__main__':img_A_path = './2007_000121.jpg'img_B_path = './2007_000123.jpg'img_AB_dir = './AB/splice'align_images([img_A_path], [img_B_path], img_AB_dir)
图片效果
二、cv2库实现图像拼接
首先调用cv2.imread()
函数读取两张图片,将两张图片拼接后调用cv2.imwrite()
函数写入到新图片文件中。
示例代码
def image_write(path_A, path_B, path_AB):if not os.path.exists(path_AB):os.makedirs(path_AB,exist_ok=True)im_A = cv2.imread(path_A, 1) # python2: cv2.CV_LOAD_IMAGE_COLOR; python3: cv2.IMREAD_COLORim_B = cv2.imread(path_B, 1) # python2: cv2.CV_LOAD_IMAGE_COLOR; python3: cv2.IMREAD_COLORim_AB = np.concatenate([im_A, im_B], 1)img_save = os.path.join(path_AB,'concate.jpg')cv2.imwrite(img_save, im_AB)if __name__ == '__main__':img_A_path = './2007_000121.jpg'img_B_path = './2007_000123.jpg'img_AB_dir = './AB/splice'image_write(img_A_path,img_B_path,img_AB_dir)
三、总结
在视觉项目中,图像数据集的预处理是一个非常重要的关键环节,在CycleGAN的项目代码中除本文 描述的一个小细节外,还有很多图像数据预处理代码值得大家学习和引用。在引言部分给出了项目代码的 hub库。想要阅读项目代码的同学可以自行下载学习。