Ниже мой код:
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 и почему я не могу их изменить?
Глядя на 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()
[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()
tf.slice([0, 0, 0], [-1, -1, 1])
среза входного изображения и оставить только R
chanel.
plt.imshow
, прочитав ееplt.imshow
документации ... Если вы сделаете это, вы увидите, что она ожидает, что вход будет иметь форму (n, m) или ( n, m, 3) или (n, m, 4). В этом случае вы пытаетесь дать ему (n, m, 1) изображение. Вы можете удалить последнее измерение (чтобы создать (n, m) изображение), выполнив tf.squeeze. Я отредактировал фрагмент кода выше, чтобы отразить это.