如何从 TensorFlow 中的图像中去除黑色 canvas

How to remove black canvas from image in TensorFlow

我目前正在尝试使用 tensorflow 数据集 'tf_flowers',并注意到很多图像主要由黑色组成 canvas,如下所示: flower1 flower2 有什么简单的方法可以 remove/or 过滤掉它吗?最好它应该批量工作,并用@tf.function编译成一个图,因为我计划将它也用于更大的数据集dataset.map(...)

黑色像素只是因为填充。这是一个简单的操作,它允许您拥有相同大小的网络输入(即您有包含大小为 223x221 的图像的批次,因为较小的图像用黑色像素填充)。

填充 的替代方法是通过以下方式预处理图像:

  • 通过裁剪操作去除填充
  • 将裁剪后的图像调整为相同大小(例如 223x221)

由于 tensorflow 映射功能,您可以简单地完成所有这些操作 python。首先,定义你的 python 函数

def py_preprocess_image(numpy_image):
    input_size = numpy_image.shape  # this is (223, 221) 
    image_proc = crop_by_removing_padding(numpy_image)
    image_proc = resize(image_proc, size=input_size)
    return image_proc 

然后,给定您的 tensorflow 数据集 train_data,将上述 python 函数映射到每个输入:

# train_data is your tensorflow dataset
train_data = train_data.map(
                 lambda x: tf.py_func(preprocess_image,
                                      inp = [x], Tout=[tf.float32]),
                 num_parallel_calls=num_threads
             )

现在,你只需要定义crop_by_removing_paddingresize,它们对普通的numpy数组进行操作,因此可以用纯python代码编写。例如:

def crop_by_removing_padding(img):
    xmax, ymax = np.max(np.argwhere(img), axis=0)
    img_crop = img[:xmax + 1, :ymax + 1]
    return img_crop

def resize(img, new_size):
    img_rs = cv2.resize(img, (new_size[1], new_size[0]), interpolation=cv2.INTER_CUBIC)
    return img_rs