Как использовать tenorflow.crop_and_resize () для четырехугольников - PullRequest
0 голосов
/ 30 декабря 2018

Я хочу обрезать и изменить размер случайного четырехугольника на изображении, определяемом 8-ю координатными точками:

(xtl, ytl), (xtr, ytr), (xbr, ybr), (xbl, ybl)

У меня есть образец кода, реализующий ту же обрезку, и измените размер прямоугольника на изображении, описывается 4 координатами -

(x1,y1), (x2, y2)

Я мало работал с C, но я все еще могу понять, что делает код, до такой степени, что непонятно, почему автор сделал вычисления.В частности, из строки 53 выше.

псевдокод до того места, где я понял:

Переменные:

Изображение -

 float * image_data // float pointer to image data of original tensor shape- A = `<Batch X Channel X Height X Width>`
 int batch_size // Batch value - for simplicity lets take single image A0= 1
 int depth // Channel value from above shape for rgb A1= 3
 int image_height // Height value from above shape  A2= 128
 int width // width value from above shape A3 = 128 

То есть исходное изображение состоит из 3 матриц 128x128 строкxcolumns

Ящики -

float * boxes_data //float pointer to boxes coordinates in format B = `[y1,x1,y2,x2] X Number_of_Boxes`
int * box_index_data // can be ignored for our purpose B0= 0 
int start_box // starting count of box B1 = 0 
int limit_box // ending count of box B2 = 5000

То есть у нас есть список из 5000 координат (в паре из 4) прямоугольников, которые мы хотим вырезать из нашего исходного изображения.

Размер каждой культуры изменяется с помощью билинейной интерполяции до требуемых размеров.

Культуры -

float * corps_data //variable of all zeroes to hold final resized cropped pixels of shape - C = <5000*3*128*128> ie. 5000 matrices of original image size
int crop_height // height we wish to crop to C0 = 8 ie height of cropped box is 8 pixels
int crop_width // width we wish to crop to C1 = 64 ie height of cropped box is 64 pixels 
float extrapolation_value // can be ignored for our purpose C2 = 0

Алгоритм:

  1. ПервыйОбход всех блоков (от 0 до 5000)
  2. инициализация текущего поля и координат (box, y1, x1, y2, x2)
  3. assert check box_index - можно игнорировать

урожай всегда больше 1 для тривиального случая,

Рассчитать height_scale = (height of box) * (scale ratio between original image and crop size) Рассчитать width_scale = (width of box) * (scale ratio between original image and crop size) Запустить второй вложенный цикл для выбора всех пикселей кадрирования в столбце Рассчитать in_y ?? --- не понял почему. Запустить второй вложенный цикл для выбора всех пикселей обрезки в столбце Снова какой-то неясный код с предательством черепа. Возвращает обрезанные значения пикселей.

Может кто-нибудь объяснить, что здесь происходит?Я должен зациклить каждый пиксель выбранной части и заполнить промежуточные пиксели, я должен интерполировать да ??

Как изменить эту функцию, чтобы обрезать и изменить размер случайного четырехугольника?

Дополнительные сведения:

Я понял теорию, лежащую в основетаким образом, чтобы удалить сдвиг квантования, они выбирают равноотстоящие пиксели, для значений пикселей между ячейками сетки это вычисляется с использованием билинейной интерполяции.Эти выбранные значения в среднем объединяются для проецирования на слой одинакового размера.

Задача:

Реализация выравнивания текста, как в этой статье

Я хочувозьмите любой произвольно ориентированный четырехугольник произвольного размера и сопоставьте его с фиксированным размером сетки, скажем, из изображения 128X128 У меня есть два четырехугольника: один маленький, например ~20x20 (box), и один большой ~80x100 (box).У меня есть их координаты.Теперь, как выбрать только эти пиксели и спроецировать их оба на один размер, скажем, 64x64 (crop).

1 Ответ

0 голосов
/ 30 декабря 2018

Вы можете решить эту проблему, используя библиотеку OpenCV.

Если четырехугольники произвольны (не параллелограммы) - вам нужны преобразования перспективы (в противном случае - более простые аффинные преобразования)

Создайте 4 пары соответствующих координат: quad vertex - результирующая вершина прямоугольника

Найти матрицу преобразования перспективы: getPerspectiveTransform

Использовать эту матрицу: warpPerspective или transform

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...