2016-07-06 2 views
1

У меня есть 4D ndarray данных изображения, который организован как [NumberOfImages, RowsOfImage, ColumnsOfImage, ChannelsOfImage].Есть ли функция изменения размера в Python для изменения размера изображения как функции tf.image.resize_images от TensorFlow?

Теперь я хочу, чтобы изменить размер изображения в ndarray 4D на новый размер, который с размером [NumberOfImages, NewRowsOfImage, NewColumnsOfImage, ChannelsOfImage], в то время как другие размеры остаются неизменными.

Я знаю, что есть функция tf.image.resize_images в TensorFlow для этого. Если новое изображение больше оригинального, новое изображение будет заполнено новыми пикселями с использованием интерполяции Bilinear или интерполяции ближайшего соседа.

Однако ndarray данных изображения был преобразован в объект Tensor TensorFlow после изменения размера. Затем я должен преобразовать его обратно в ndarray. Эти процедуры будут стоить огромного времени.

Я пробовал skimage.transform.resize, но эта функция изменяет размер данных 2D-изображения. Если я использую эту функцию, я должен использовать для цикла, который также будет стоить огромного времени.

Итак, есть функция изменения размера в Python, которая аналогична функции tf.image.resize_images от TensorFlow? Если нет, может ли кто-нибудь дать мне несколько советов, чтобы решить мою проблему?

спасибо.

ответ

1

использование numpy.resize. Пример ниже. Все изображения имеют одинаковую форму (в данном случае 768 x 1024 x 3). В этом примере я переключил номер строки с номером столбца. im_all - ваш 4d-массив.

from scipy.misc import imread 
import numpy as np 
import matplotlib.pyplot as plt 
f = r"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg" 
im0 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\koala.jpg" 
im1 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\tulips.jpg" 
im2 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\desert.jpg" 
im3 = imread(f) 
im_all = np.array([im0, im1, im2, im3]) 
im_all_b = np.resize(im_all, [im_all.shape[0], im_all.shape[2], im_all.shape[1], im_all.shape[3]]) 
plt.figure() 
plt.imshow(im_all_b[1]) 
plt.figure() 
plt.imshow(im_all[1]) 
plt.show() 

Ниже приведен пример с интерполяцией (по умолчанию bilinear, см: http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.misc.imresize.html) с оптимизацией использования памяти:

from scipy.misc import imread, imresize 
import numpy as np 
import matplotlib.pyplot as plt 
f = r"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg" 
im0 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\koala.jpg" 
im1 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\tulips.jpg" 
im2 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\desert.jpg" 
im3 = imread(f) 
im_all = np.array([im0, im1, im2, im3]) 
for i in range(im_all.shape[0]): 
    temp = im_all[0, :, :, :].copy() 
    im_all = np.delete(im_all, 0, 0) 
    temp = imresize(temp, (temp.shape[0]+200, temp.shape[1]+200, 3)) 
    temp = np.expand_dims(temp, axis=0) 
    try: 
     im_all_b = np.vstack([im_all_b, temp]) 
    except NameError: 
     im_all_b = temp 

plt.figure() 
plt.imshow(im_all_b[1]) 
plt.show() 

В приведенном выше примере добавить 200 пикселей в каждый из х и у оси.

+0

Спасибо. Но операция в вашем примере - это просто изменение изображения. Тогда Кажется, что функция np.resize может изменить размер изображения на большее изображение. Однако он не изменяет его размер с использованием общего метода интерполяции, такого как метод интерполяции ближайшего соседа, такой как функция tf.image.resize_images TensorFlow. Он просто заполняет исходное изображение повторяющимися его копиями. Мне жаль, что это не то, что я хочу. В любом случае, спасибо вам все равно. – Kongsea

+0

см. Мой отредактированный ответ. –

+0

Да, он работает на этот раз. Но ваша программа использовала ** для цикла **, который занимал много времени, так как наши данные изображения содержат сотни тысяч изображений. Кроме того, когда данные изображения были перемасштабированы в формат float от 0 до 1, появится ошибка, которая показывает, что формат не поддерживается. В любом случае, большое спасибо за вашу любезную помощь. – Kongsea