我想从由8个坐标点定义的图像中裁剪随机四边形并调整其大小:
(xtl, ytl), (xtr, ytr), (xbr, ybr), (xbl, ybl)
我有a code sample implementing the same crop and resize for a rectangle from an image, described by 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行x列的矩阵
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
对于普通情况,crop总是大于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)
有人可以解释一下这里发生的情况吗? 我必须遍历选择部分的每个像素并填充临时像素,我必须内插yes?
如何更改此功能以裁剪和调整随机四边形的大小?
更多阅读:
实施文本与this paper对齐
我想输入任意随机大小和方向的四边形并将其映射到固定的网格大小,例如从128X128
的图像来看,我有两个四边形,一个像~20x20 (box)
一样小,另一个像~80x100 (box)
。我有他们的坐标。现在,如何只选择这些像素并将它们都投影为统一的大小64x64 (crop)
。
答案 0 :(得分:0)
您可以使用OpenCV库解决此问题。
如果四边形是任意的(不是平行四边形)-您需要透视变换(否则-简单的仿射变换)
制作4对相应的坐标:四边形顶点-生成的矩形顶点
透视变换的查找矩阵:getPerspectiveTransform
使用此矩阵: warpPerspective 或 transform