有没有一种方法可以将张量对象转换为数组以便与OpenCV函数一起使用?

时间:2020-09-08 05:11:00

标签: python tensorflow opencv image-processing

我正在与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图像的最佳选择?

0 个答案:

没有答案