我正在与image dataset一起工作,在这里我想使用一些OpenCV函数对图像进行预处理。要加载数据集,我使用以下代码:
train_ds = tf.keras.preprocessing.image_dataset_from_directory(train_dir,
validation_split = 0.2,
subset = "training",
seed = 1337,
image_size = (img_height, img_width),
batch_size = batch_size)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(train_dir,
validation_split = 0.2,
subset = "validation",
seed = 1337,
image_size = (img_height, img_width),
batch_size = batch_size)
对于预处理,我使用以下功能(Source):
def create_mask_for_plant(image):
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
sensitivity = 35
lower_hsv = np.array([60 - sensitivity, 100, 50])
upper_hsv = np.array([60 + sensitivity, 255, 255])
mask = cv2.inRange(image_hsv, lower_hsv, upper_hsv)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
return mask
def segment_plant(image):
mask = create_mask_for_plant(image)
output = cv2.bitwise_and(image, image, mask = mask)
return output
def sharpen_image(image):
image_blurred = cv2.GaussianBlur(image, (0, 0), 3)
image_sharp = cv2.addWeighted(image, 1.5, image_blurred, -0.5, 0)
return image_sharp
我想使用这些功能通过将数据集映射到功能来处理数据。
def input_preprocess(image, label):
image = create_mask_for_plant(image)
image = segment_plant(image)
image = sharpen_image(image)
label = tf.one_hot(label, 12)
return image, label
train_ds = train_ds.map(
input_preprocess, num_parallel_calls=tf.data.experimental.AUTOTUNE
)
val_ds = val_ds.map(input_preprocess)
在input_preprocess
函数中,图像的类型为<class 'tensorflow.python.framework.ops.Tensor'>
,但是cv2函数采用数组输入。我尝试将image.numpy()
和tf.make_ndarray(image)
转换为数组,但是它们都不起作用。
还有其他方法可以做到这一点,还是将数据读取为PIL图像的最佳选择?