如何对四边形使用tensorflow.crop_和_resize()

如何对四边形使用tensorflow.crop_和_resize(),c,tensorflow,image-processing,geometry,C,Tensorflow,Image Processing,Geometry,我想从由8个坐标点定义的图像中裁剪并调整随机四边形的大小: (xtl, ytl), (xtr, ytr), (xbr, ybr), (xbl, ybl) 我有坐标- (x1,y1), (x2, y2) 我对C没有太多的了解,但我仍然能够理解代码在做什么,直到无法理解作者为什么要进行计算为止。特别是从上述要点的第53行开始 伪代码,直到我理解: 涉及的变量: 形象- 也就是说,我们有一个5000个坐标(4对)的矩形列表,我们希望从原始图像中裁剪 通过使用双线性插值将每个裁剪调整为所需的裁剪尺寸

我想从由8个坐标点定义的图像中裁剪并调整随机四边形的大小:

(xtl, ytl), (xtr, ytr), (xbr, ybr), (xbl, ybl)
我有坐标-

(x1,y1), (x2, y2)
我对C没有太多的了解,但我仍然能够理解代码在做什么,直到无法理解作者为什么要进行计算为止。特别是从上述要点的第53行开始

伪代码,直到我理解:

涉及的变量:

形象- 也就是说,我们有一个5000个坐标(4对)的矩形列表,我们希望从原始图像中裁剪

通过使用双线性插值将每个裁剪调整为所需的裁剪尺寸

庄稼-
float*corps\u data//全零变量,用于保存形状的最终调整大小的裁剪像素-C=即原始图像大小的5000个矩阵
int crop\u height//我们希望裁剪到C0=8的高度,即裁剪框的高度为8像素
int crop_width//width我们希望裁剪到C1=64,即裁剪框的高度为64像素
为了我们的目的,可以忽略浮点外推值//C2=0
算法:
  • 所有箱子上的第一个回路(0到5000)
  • 初始化当前框和坐标(框,y1,x1,y2,x2)
  • 断言复选框\u索引-可以忽略
  • 对于一般情况,作物始终大于1

  • 计算
    height\u scale=(框的高度)*(原始图像和裁剪尺寸之间的比例)
  • 计算
    width\u scale=(框的宽度)*(原始图像和裁剪尺寸之间的比例)
  • 启动第二个嵌套循环以选择列中的所有裁剪像素
  • 以y计算
  • ---我不明白为什么
  • 启动第二个嵌套循环以选择列中的所有裁剪像素
  • 又是一些晦涩难懂的骷髅阴谋,混淆了代码
  • 返回裁剪后的像素值 有人能解释一下这里发生了什么吗? 我必须循环选择部分的每个像素,并填充中间像素,我必须插值是

    如何更改此函数以裁剪和调整随机四边形的大小

    更多阅读:

    我理解了它背后的理论,为了消除量化偏移,他们对等距像素进行采样,对于网格单元之间的像素值,使用双线性插值进行计算。将这些选定值平均合并到一个统一大小的图层上

    任务: 实现文本对齐,如中所示


    我想输入任意大小和方向的四边形,并将其映射到固定的网格大小,比如从
    128X128
    的图像中,我有两个四边形,一个小的像
    ~20x20(长方体)
    ,一个大的
    ~80x100(长方体)
    。我有他们的坐标。现在,如何仅选择这些像素并将它们投影到统一的大小,例如
    64x64(裁剪)

    ,您可以使用OpenCV库解决此问题

    如果四边形是任意的(不是平行四边形),则需要透视变换(否则需要更简单的仿射变换)

    制作4对对应的坐标:四边形顶点-生成的矩形顶点

    查找透视变换矩阵:


    使用此矩阵:透视图变换

    您真正的目标是什么-将一些非矩形图像区域映射为矩形?它可能是用OpenCV函数执行的。我想输入任意大小和方向的四边形,并将其映射到固定的网格大小,比如说从128X128的图像中,我有两个四边形,一个小的像20x20(长方体),一个大的像80x100(长方体)。我有他们的坐标。现在,如何只选择这些像素,并将它们都投影到一个统一的大小,比如64x64(裁剪),这很好,解决了一个问题。我确实理解透视变换是如何完成的。然而,这是神经网络的一部分,我也不需要为反向计算计算梯度:双线性的梯度可以通过:d(grad)/d(Vpi)=SUM{g(px,pix)反向计算∗ (py,piy)}因此,质疑基本代码是如何工作的。但最初的问题并没有涉及神经网络等。是的,它要求解释代码。几何体的工作原理。实际上并不是一个包中的另一个函数。上面的C代码是如何进行仿射变换的,你能帮我吗?
     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 
    
    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
    
    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