图像去噪与数据增强

在计算机视觉领域,经常需要对整个数据集应用某种变换。Keras的ImageDataGenerator类提供了诸如翻转、归一化等多种变换。然而,当需要应用Keras中没有的自定义变换时,就会遇到困难。以例子为例,将对数据集应用去噪算法作为预处理变换。一种简单的方法是对数据集中的所有图像应用去噪函数,并将处理后的图像保存到另一个目录。然而,这既耗时又占用空间。另一种方法是使用preprocessing_function属性实时执行此变换。

为了加载训练图像,使用了Keras中实现的flow_from_directory()方法。使用OpenCV进行去噪相对简单,它提供了几种内置算法。在本文中,将展示如何定义自己的预处理函数,将其传递给训练生成器,并直接将图像输入模型,从而消除保存它们的需要。本教程将大致分为两部分:实现去噪算法和扩展预处理函数。让立即开始吧!

第一部分 – 实现去噪算法

让准备一个函数,它接受一个图像作为输入,应用内置的去噪算法,并返回处理后的图像。

import cv2 import numpy as np def preprocessing_fun(filename): img = cv2.imread(filename) dst = cv2.fastN1MeansDenoisingColored(img, None, 10, 10, 7, 21) return dst

使用OpenCV中的fastN1MeansDenoisingColored算法,因为这个算法适用于彩色图像。OpenCV还提供了其他适用于单通道图像的算法。现在已经实现了算法,让在ImageDataGenerator类中使用它。

第二部分 – 扩展预处理函数

img_datagen = ImageDataGenerator(rescale=1./255, preprocessing_function = preprocessing_fun) training_gen = img_datagen.flow_from_directory(PATH, target_size=(224,224), color_mode='rgb', batch_size=32, shuffle=True) def transform1(img): # 应用水平翻转变换并返回图像 return cv2.flip(img, 1) def transform2(img): # 应用垂直翻转变换并返回图像 return cv2.flip(img, 0) def transform3(img): # 应用180度旋转变换并返回图像 return cv2.rotate(img, cv2.ROTATE_180) def our_preprocessing_function(filename): # 组合所有变换 img = cv2.imread(filename) img1 = transform1(img) img2 = transform2(img1) final_img = transform3(img2) return final_img img_datagen = ImageDataGenerator(rescale=1./255, preprocessing_function = our_preprocessing_function) training_generator = img_datagen.flow_from_directory(PATH, target_size=(224,224), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485