将图像编辑为tensorflow张量python

时间:2018-08-05 22:58:40

标签: python tensorflow image-processing

我将尽力在此处提供一个可重复的示例。

我有一张图片:

enter image description here

亚伦·埃克哈特(Aaron Eckhart)的这张照片是(150, 150)

我的目标是通过对像素进行数学运算来干扰此图像的ROI,但是问题是数学必须作为张量流张量进行,因为要进行的数学运算是将张量乘以张量比例梯度(也是张量(row_pixels,column_pixels,3))

这就是我想象的过程:

  1. 以numpy数组RGB大小读取图像:(1、150、150、3)(1是批处理 大小)

    w, h = img.shape

    ret = np.empty((w, h, 3), dtype=np.uint8)

    ret[:, :, 0] = ret[:, :, 1] = ret[:, :, 2] = img

  2. 使像素值介于0和1之间

    img = (faces1 - min_pixel) / (max_pixel - min_pixel)

  3. for i in range(steps):

(a)提取图像的ROI 这是我不知道该怎么做的部分

(b)计算较小的img ROI张量损失的梯度

loss = utils_tf.model_loss(y, preds, mean=False)
grad, = tf.gradients(loss, x)

(c)将img ROI张量乘以损耗梯度

scaled_grad = eps * normalized_grad
adv_img = img + scaled_grad

(d)将此新扰动的ROI张量放回与原始张量相同的位置这是我不知道如何做的另一部分

这将导致图像中只有一些像素值受到干扰,其余像素值保持不变

1 个答案:

答案 0 :(得分:5)

给出图片:

Full image: two elephants

(a)从图像中获取感兴趣的区域((440、240),(535、380)):

roi_slice = tf.slice(
  image_in,
  [top_left_x, top_left_y, top_left_z],
  [roi_len_x, roi_len_y, bottom_right_z]
)

Extracted region of interest: baby elephant

获取与图像大小相同的ROI布尔值蒙版

roi_mask = tf.ones_like(roi_slice)
mask_canvas = tf.image.pad_to_bounding_box(
  [roi_mask],
  top_left_x,
  top_left_y,
  np_image.shape[0],
  np_image.shape[1]
)
bool_mask = tf.cast(mask_canvas, tf.bool)

Mask of ROI

(b)在此示例中,我使用的是伪渐变,但您可以用真实的渐变代替。

fake_gradients = tf.ones_like(image_in) * 0.2

(c)遮盖渐变,以获取ROI所在的渐变,否则为0。

masked_gradients = tf.where(bool_mask[0], fake_gradients, mask_canvas[0])

(d)制作图像的可编辑副本,并使用蒙版渐变对其进行更新

# Make an editable copy of the image
editable_image = tf.get_variable(
    name='editable_image', shape=image_in.shape, dtype=tf.float32)
init_op = tf.assign(editable_image, image_in)

# Make sure we don't update the image before we've set its initial value.
with tf.control_dependencies([init_op]):
  update_roi_op = tf.assign_add(editable_image, masked_gradients)

Highlighted ROI

您可以找到功能完善的Colab示例on GitHub