如何将tensorflow.crop_and_resize()用于四边形

时间:2018-12-30 01:10:09

标签: c tensorflow image-processing geometry

我想从由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

算法:

  1. 首先循环遍历所有框(0到5000)
  2. 初始化当前的框和坐标(框,y1,x1,y2,x2)
  3. 声明checkbox_index-可以忽略

对于普通情况,crop总是大于1

  1. 计算height_scale = (height of box) * (scale ratio between original image and crop size)
  2. 计算width_scale = (width of box) * (scale ratio between original image and crop size)
  3. 启动第二个嵌套循环以选择列
  4. 中的所有裁剪像素
  5. 计算in_y?
  6. ---不明白为什么。
  7. 启动第二个嵌套循环以选择列中的所有裁剪像素
  8. 重新获得一些晦涩难懂的颅骨背叛代码。
  9. 返回裁剪的像素值。

有人可以解释一下这里发生的情况吗? 我必须遍历选择部分的每个像素并填充临时像素,我必须内插yes?

如何更改此功能以裁剪和调整随机四边形的大小?

更多阅读:

我理解其背后的理论,即消除对等距像素采样的量化偏移,对于网格单元之间的像素值,它是使用双线性插值法计算的。这些选定的值将平均合并以投影到大小一致的图层上。

任务:

实施文本与this paper对齐

我想输入任意随机大小和方向的四边形并将其映射到固定的网格大小,例如从128X128的图像来看,我有两个四边形,一个像~20x20 (box)一样小,另一个像~80x100 (box)。我有他们的坐标。现在,如何只选择这些像素并将它们都投影为统一的大小64x64 (crop)

1 个答案:

答案 0 :(得分:0)

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

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

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

透视变换的查找矩阵:getPerspectiveTransform

使用此矩阵: warpPerspective transform