如何从 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_padding
和resize
,它们对普通的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
我目前正在尝试使用 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_padding
和resize
,它们对普通的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