Интерпретация Protobuf для программы Python ⇐ Python
-
Anonymous
Интерпретация Protobuf для программы Python
Мне предоставлен интерфейс protobuf, в котором есть «изображение», которое нужно повернуть на 90 градусов. Я застрял на представлении изображения, поскольку оно передается с байтами типа данных, а не с 2D-матрицей. Вот файл protobuf:
Синтаксис
= "proto3"; опция java_multiple_files = true; опция java_package = "imageRotation"; // Одно изображение, которое может быть полутоновым или цветным. // // Когда color == false, это изображение в оттенках серого. // В данном случае данные одноканальные (один байт на пиксель) // и сохраняется построчно. // // Когда color == true, это цветное изображение. В // в этом случае данные представляют собой 3-канальный RGB с RGB // триплеты хранятся построчно (один байт на канал, 3 байта // на пиксель). Изображение сообщения { логический цвет = 1; байты данных = 2; ширина int32 = 3; высота int32 = 4; } // Запрос на поворот изображения на угол, кратный 90 градусам. // // Входное изображение может быть цветным или полутоновым. // // Положительное вращение происходит против часовой стрелки. сообщение ImageRotateRequest { перечисление Вращение { НЕТ = 0; ДЕВЯНЕТЬ_ГРАД = 1; ONE_EIGHTY_DEG = 2; ДВА_СЕВЕНТИ_ГРАД = 3; } Вращение вращения = 1; Изображение изображения = 2; } сервис ImageService { rpc RotateImage(ImageRotateRequest) возвращает (Изображение); } Я очень не понимаю, как мне преобразовать «байтовые данные» в сетку значений RGB, которая будет представлять изображение.
вот мой текущий подход:
# Импортируем необходимые модули и сгенерированные классы protobuf из image_pb2 импортировать изображение, ImageRotateRequest, ImageService из фьючерсов на параллельный импорт импортировать grpc # Функция для поворота матрицы изображения на указанное количество поворотов на 90 градусов. Защиту Rotate_image (изображение, вращения): вращение_маппинг = { ImageRotateRequest.NONE: 0, ImageRotateRequest.NINETY_DEG: 90, ImageRotateRequest.ONE_EIGHTY_DEG: 180, ImageRotateRequest.TWO_SEVENTY_DEG: 270, } вращения = Rotation_mapping.get(вращения, 0) # Извлекаем детали изображения из запроса is_color = изображение.цвет ширина = изображение.ширина высота = изображение.высота # Рассчитать размер матрицы на основе цвета и ширины/высоты размер_матрицы = ширина * высота * (3, если is_color, иначе 1) # Декодируем данные изображения из байтов в матрицу matrix_values = список(image.data[:matrix_size]) если is_color: # Для цветных изображений измените форму матрицы на 3D-матрицу (3 канала). матрица = [значения_матрицы[i:i+3] для i в диапазоне (0, размер_матрицы, 3)] еще: матрица = [значения_матрицы] # Поворачиваем матрицу по запросу Rotad_matrix = [список(строка) для строки в zip(*matrix[::-1])] # Поворот на 90 градусов # Сглаживаем повернутую матрицу обратно в список значений roted_values = [значение для строки в Rotated_matrix для значения в строке] # Создайте новое изображение с повернутыми значениями повернутое_изображение = Изображение( цвет = is_color, данные = байты (повернутые_значения), ширина = высота, height=width # Меняем местами ширину и высоту после поворота ) вернуть повернутое_изображение # реализация службы gRPC класс ImageServiceImpl(ImageService): def RotateImage(сам, запрос, контекст): # Поворот изображения по запросу повернутое_изображение = поворот_изображения(запрос.изображение, запрос.вращение) # Возвращаем повернутое изображение в ответ вернуть повернутое_изображение # настройка сервера gRPC защита служить(): сервер = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) ImageService.add_RotateImageServicer_to_server(ImageServiceImpl(), сервер) server.add_insecure_port('[::]:50051') сервер.start() server.wait_for_termination() если __name__ == '__main__': служить() Поэтому я не понимаю, как переданный параметр bytes будет заполнять матрицу значений ширины x высоты.
Будем благодарны за любую помощь, это непростая задача. Спасибо!
Мне предоставлен интерфейс protobuf, в котором есть «изображение», которое нужно повернуть на 90 градусов. Я застрял на представлении изображения, поскольку оно передается с байтами типа данных, а не с 2D-матрицей. Вот файл protobuf:
Синтаксис
= "proto3"; опция java_multiple_files = true; опция java_package = "imageRotation"; // Одно изображение, которое может быть полутоновым или цветным. // // Когда color == false, это изображение в оттенках серого. // В данном случае данные одноканальные (один байт на пиксель) // и сохраняется построчно. // // Когда color == true, это цветное изображение. В // в этом случае данные представляют собой 3-канальный RGB с RGB // триплеты хранятся построчно (один байт на канал, 3 байта // на пиксель). Изображение сообщения { логический цвет = 1; байты данных = 2; ширина int32 = 3; высота int32 = 4; } // Запрос на поворот изображения на угол, кратный 90 градусам. // // Входное изображение может быть цветным или полутоновым. // // Положительное вращение происходит против часовой стрелки. сообщение ImageRotateRequest { перечисление Вращение { НЕТ = 0; ДЕВЯНЕТЬ_ГРАД = 1; ONE_EIGHTY_DEG = 2; ДВА_СЕВЕНТИ_ГРАД = 3; } Вращение вращения = 1; Изображение изображения = 2; } сервис ImageService { rpc RotateImage(ImageRotateRequest) возвращает (Изображение); } Я очень не понимаю, как мне преобразовать «байтовые данные» в сетку значений RGB, которая будет представлять изображение.
вот мой текущий подход:
# Импортируем необходимые модули и сгенерированные классы protobuf из image_pb2 импортировать изображение, ImageRotateRequest, ImageService из фьючерсов на параллельный импорт импортировать grpc # Функция для поворота матрицы изображения на указанное количество поворотов на 90 градусов. Защиту Rotate_image (изображение, вращения): вращение_маппинг = { ImageRotateRequest.NONE: 0, ImageRotateRequest.NINETY_DEG: 90, ImageRotateRequest.ONE_EIGHTY_DEG: 180, ImageRotateRequest.TWO_SEVENTY_DEG: 270, } вращения = Rotation_mapping.get(вращения, 0) # Извлекаем детали изображения из запроса is_color = изображение.цвет ширина = изображение.ширина высота = изображение.высота # Рассчитать размер матрицы на основе цвета и ширины/высоты размер_матрицы = ширина * высота * (3, если is_color, иначе 1) # Декодируем данные изображения из байтов в матрицу matrix_values = список(image.data[:matrix_size]) если is_color: # Для цветных изображений измените форму матрицы на 3D-матрицу (3 канала). матрица = [значения_матрицы[i:i+3] для i в диапазоне (0, размер_матрицы, 3)] еще: матрица = [значения_матрицы] # Поворачиваем матрицу по запросу Rotad_matrix = [список(строка) для строки в zip(*matrix[::-1])] # Поворот на 90 градусов # Сглаживаем повернутую матрицу обратно в список значений roted_values = [значение для строки в Rotated_matrix для значения в строке] # Создайте новое изображение с повернутыми значениями повернутое_изображение = Изображение( цвет = is_color, данные = байты (повернутые_значения), ширина = высота, height=width # Меняем местами ширину и высоту после поворота ) вернуть повернутое_изображение # реализация службы gRPC класс ImageServiceImpl(ImageService): def RotateImage(сам, запрос, контекст): # Поворот изображения по запросу повернутое_изображение = поворот_изображения(запрос.изображение, запрос.вращение) # Возвращаем повернутое изображение в ответ вернуть повернутое_изображение # настройка сервера gRPC защита служить(): сервер = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) ImageService.add_RotateImageServicer_to_server(ImageServiceImpl(), сервер) server.add_insecure_port('[::]:50051') сервер.start() server.wait_for_termination() если __name__ == '__main__': служить() Поэтому я не понимаю, как переданный параметр bytes будет заполнять матрицу значений ширины x высоты.
Будем благодарны за любую помощь, это непростая задача. Спасибо!
Мобильная версия