c - 如何对四边形使用tensorflow.crop_and_resize()

标签 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. 初始化当前框和坐标(box、y1、x1、y2、x2)
  3. 断言复选框_index - 可以忽略

对于简单情况,crop 始终大于 1,

  • 计算height_scale =(框的高度)*(原始图像与裁剪尺寸之间的比例)
  • 计算width_scale =(框的宽度)*(原始图像与裁剪尺寸之间的比例)
  • 启动第二个嵌套循环以选择列中的所有裁剪像素
  • 计算 in_y ??
  • ---不明白为什么。
  • 启动第二个嵌套循环以选择列中的所有裁剪像素
  • 又是一些晦涩的头骨背叛混淆代码。
  • 返回裁剪后的像素值。
  • 有人可以解释一下这里发生的事情吗? 我必须循环选择部分的每个像素并填充临时像素,我必须插值是吗?

    如何更改此函数以裁剪随机四边形并调整其大小?

    更多阅读:

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

    任务:

    实现文本对齐,如 this paper 所示

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

    最佳答案

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

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

    制作4对对应坐标:四边形顶点 - 所得矩形顶点

    求透视变换矩阵:getPerspectiveTransform

    使用此矩阵:warpPerspectivetransform

    关于c - 如何对四边形使用tensorflow.crop_and_resize(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53974575/

    相关文章:

    c - 如何正确链接 libssh?

    python - (https ://www. tensorflow.org/tensorboard/get_started) 上的 Tensorboard 2.1.0 示例无法正常工作

    macos - 如何在 Mac OS X Lion 上通过 Cmake 编译 OpenCV 2.4.0 (beta2)?

    python - Opencv MedianBlur实际如何工作?

    python - 使用 python install 命令出现超时消息

    python - 将像素值显示为图像

    c - 我的老师告诉我我的代码是垃圾,为什么?

    c++ - 在 BAZEL 中,有没有办法防止依赖 C/C++ header 传播到依赖库?

    c - uv_write 实际上是异步的吗?

    python - 模块 'tensorflow._api.v2.train' 没有属性 'GradientDescentOptimizer'