image-processing - 在 Keras ImageDataGenerator 或 flow_from_directory 中裁剪图像的中心
问题描述
我正在尝试使用 keras 在图像数据生成器中裁剪图像的中心。我有大小的图像,192x192
我想裁剪它们的中心,以便输出批次150x150
或类似的东西。
我可以立即在 Keras 中执行此操作ImageDataGenerator
吗?我猜不是,因为我看到数据生成器中的target_size
参数破坏了图像。
我找到了这个随机裁剪的链接: https ://jkjung-avt.github.io/keras-image-cropping/
我已经修改了作物如下:
def my_crop(img, random_crop_size):
if K.image_data_format() == 'channels_last':
# Note: image_data_format is 'channel_last'
assert img.shape[2] == 3
height, width = img.shape[0], img.shape[1]
dy, dx = random_crop_size #input desired output size
start_y = (height-dy)//2
start_x = (width-dx)//2
return img[start_y:start_y+dy, start_x:(dx+start_x), :]
else:
assert img.shape[0] == 3
height, width = img.shape[1], img.shape[2]
dy, dx = random_crop_size # input desired output size
start_y = (height - dy) // 2
start_x = (width - dx) // 2
return img[:,start_y:start_y + dy, start_x:(dx + start_x)]
def crop_generator(batches, crop_length):
'''
Take as input a Keras ImageGen (Iterator) and generate
crops from the image batches generated by the original iterator
'''
while True:
batch_x, batch_y = next(batches)
#print('the shape of tensor batch_x is:', batch_x.shape)
#print('the shape of tensor batch_y is:', batch_y.shape)
if K.image_data_format() == 'channels_last':
batch_crops = np.zeros((batch_x.shape[0], crop_length, crop_length, 3))
else:
batch_crops = np.zeros((batch_x.shape[0], 3, crop_length, crop_length))
for i in range(batch_x.shape[0]):
batch_crops[i] = my_crop(batch_x[i], (crop_length, crop_length))
yield (batch_crops, batch_y)
这个解决方案在我看来很慢,请问还有其他更有效的方法吗?你有什么建议?
提前致谢
解决方案
我试图以这种方式解决它:
def crop_generator(batches, crop_length):
while True:
batch_x, batch_y = next(batches)
start_y = (img_height - crop_length) // 2
start_x = (img_width - crop_length) // 2
if K.image_data_format() == 'channels_last':
batch_crops = batch_x[:, start_x:(img_width - start_x), start_y:(img_height - start_y), :]
else:
batch_crops = batch_x[:, :, start_x:(img_width - start_x), start_y:(img_height - start_y)]
yield (batch_crops, batch_y)
如果您有更好的方法,请提出您的建议。
推荐阅读
- javascript - Laravel 和 Livewire:组件更改时如何执行 javascript 函数?
- r - 通过迭代功能一步导入和合并数据集?
- reactjs - Webpack 收集错误的 src 路径
- cassandra - 在 cassandra 中使用 sstableloader 恢复数据时出现错误
- node.js - 将文件从 HTML 表单发送到外部 API(如何在节点 fetch/axios 中制作 curl file=@...)
- javascript - 反应日期选择器无法显示日期时间
- javascript - 当我按下手风琴时砌体不工作(高度没有增加)
- sql - Presto - 插入缺失的时间戳
- python - 将列表值分配给字典值和键下的总和值
- database - 我如何更改数据库文件位置 Flutter