Python中是否有resize函数来调整图像大小,如TensorFlow的tf.image.resize_images函数?

时间:2016-07-06 09:06:34

标签: python image numpy tensorflow scikit-image

我有4D ndarray的图像数据,其组织为[NumberOfImages, RowsOfImage ColumnsOfImage ,ChannelsOfImage]。

现在我想将4D nararray中的图像调整为新大小,其大小为[NumberOfImages, NewRowsOfImage NewColumnsOfImage ,ChannelsOfImage],而其他方面保持不变。

我知道在TensorFlow中有一个函数 tf.image.resize_images 来执行此操作。如果新图像大于原始图像,则使用双线性插值或最近邻插值将新图像填充新像素。

然而,在调整大小后,图像数据的ndarray被转换为TensorFlow的Tensor对象。然后我必须将它转换回ndarray。这些程序将花费大量时间。

我尝试了 skimage.transform.resize ,但此功能似乎调整了2D图像数据的大小。如果我使用此功能,我必须使用 for loop ,这将耗费大量时间。

Python中是否有resize函数与TensorFlow的tf.image.resize_images函数相同?如果没有,有人可以给我一些建议来解决我的问题吗?

非常感谢。

1 个答案:

答案 0 :(得分: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()

在上面的示例中,我为x轴和y轴各添加了200个像素。