Понять параметры tf.slice в тензорном потоке и почему я не могу его изменить

1

Ниже мой код:

import matplotlib.pyplot as plt
import matplotlib.image as mp_image
filename = "abc.jpeg"
input_image = mp_image.imread(filename)
my_image=tf.placeholder("uint8",[None, None, 3])
myimage=tf.placeholder("uint8",[None, None, 3])
slice1=tf.slice(my_image,[0,100,0],[300,400,-1]) #[x,y,?],[x,y,?]
with tf.Session() as sess:
    result = sess.run(slice1,feed_dict={my_image: input_image})
print(result.shape)
plt.imshow(result)
plt.show()

Во срезе 1, какие параметры передаются как список, указывают [x, y,?], [X, y,?].

В tf.slice(image_tensor, [0,0,0], [100,200, -1]). Что здесь означает 0 и -1 и почему я не могу их изменить?

Теги:
tensorflow
python-3.x
slice

2 ответа

0

Глядя на docstring для tf.slice, параметры input_, begin и size соответственно. Ваш код делает

slice1=tf.slice(my_image,[x_begin,y_begin,channel_begin],[x_size,y_size,channel_size])

Обратите внимание, что третий параметр описывает size и не абсолютный, to индекс (@XMANX ошибочно). Параметр size принимает заданное значение -1, что означает, что все остальные элементы в размерности включены в срез.

Например, если бы у вас был тензор t с формой [X, Y, Z]

tf.slice(t, [x_begin, y_begin, z_begin], [x_size, y_size, z_size])

эквивалентно

t[x_begin : x_begin+x_size, y_begin : y_begin+y_size, z_begin : z_begin+z_size]

Чтобы извлечь только R-канал из изображения, вы сделали бы что-то вроде:

import matplotlib.pyplot as plt
import matplotlib.image as mp_image

filename = "abc.jpeg"
input_image = mp_image.imread(filename)
my_image=tf.placeholder("uint8",[None, None, 3])
# Doesn't slice along the x and y dimensions, but takes only one channel
sliced = tf.slice(my_image,[0, 0, 0], [-1, -1, 1])
squeezed = tf.squeeze(slice)  # Removes last dimension
with tf.Session() as sess:
    result = sess.run(squeezed,feed_dict={my_image: input_image})
plt.imshow(result)
plt.show()
  • 0
    Я даю сообщение об ошибке «plt.imshow (result)» || ** TypeError: Неверные размеры для данных изображения ** || ... может ли он действительно печатать только R канал. Пожалуйста, предоставьте мне полный фрагмент кода, который печатает только один канал. @rachelim
  • 0
    Когда вы получаете такую ошибку, вы должны проверить, какую форму ввода ожидает plt.imshow , прочитав ее plt.imshow документации ... Если вы сделаете это, вы увидите, что она ожидает, что вход будет иметь форму (n, m) или ( n, m, 3) или (n, m, 4). В этом случае вы пытаетесь дать ему (n, m, 1) изображение. Вы можете удалить последнее измерение (чтобы создать (n, m) изображение), выполнив tf.squeeze. Я отредактировал фрагмент кода выше, чтобы отразить это.
0

[x,y,?],[x,y,?] в вашем случае, третьим параметром формы является количество каналов изображения

Для ответа на второй вопрос давайте посмотрим, как работает tf.slice, в случае изображения с каналами RGB он выглядит как tf.slice([from_x, from_y, from_channel], [to_x, to_y, to_channel]) также в форме вы можете использовать -1 таким образом, чтобы вы -1 потока сенсора максимально доступное значение. Из вашего примера кода вы пытаетесь ввести изображение с фрагментами [0,100, 0],[300,400, 3], вы можете изменить третий параметр и это действительный код, но следует помнить, что matplotlib позволяет показывать только изображения (M, N), (M, N, 3), (M, N, 4)

Обозначение кода:

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import matplotlib.image as mp_image

filename = "abc.png"
input_image = mp_image.imread(filename)
my_image = tf.placeholder("float32",[None, None, 3])
myimage = tf.placeholder("float32",[None, None, 3])

# this way you slicing RGB image
slice1=tf.slice(my_image,[0,100,0],[300, 400, -1])

with tf.Session() as sess:
    result = sess.run(slice1, feed_dict={my_image: input_image})

plt.subplot(1, 2, 1)
plt.imshow(result)

# this way you slicing image and keep just R channel
slice1=tf.slice(my_image,[0,100,0],[300, 400, 1]) #[x,y,?],[x,y,?]

with tf.Session() as sess:
    result = sess.run(slice1, feed_dict={my_image: input_image})

plt.subplot(1, 2, 2)
# matplotlib imshow show need extra options to render image with single chanel
plt.imshow(np.reshape(result, (result.shape[0], result.shape[1])), cmap='gray')
plt.show()

Изображение результатов

  • 0
    Могу ли я изменить значения from_channel и to_channel? Если да, каковы могут быть его возможные значения и какую разницу это даст в результате?
  • 0
    Вы можете изменить это значение, например, tf.slice([0, 0, 0], [-1, -1, 1]) среза входного изображения и оставить только R chanel.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню