Я хочу обрезать и изменить размер случайного четырехугольника на изображении, определяемом 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
Алгоритм:
- ПервыйОбход всех блоков (от 0 до 5000)
- инициализация текущего поля и координат (box, y1, x1, y2, x2)
- 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)
.